题目:http://acm.hdu.edu.cn/showproblem.php?pid=5745
C++ bitset的用法:https://www.cnblogs.com/magisk/p/8809922.html
题目:
题意:给两个字符串 a 和 b ,b可以进行变换,规则是可以任意交换相邻两个字符的位置,但是不可以有交叉。求a中每一个位置能不能匹配b或b变换得到的子串。
思路:dp,dp[i]表示匹配模式串前i+1个的状况,其中dp[i][0],dp[i][1],dp[i][2]分别表示和前一个交换,不交换,和后一个交换的情况,采用bitset优化。
代码:
#include<iostream>
#include<string.h>
#include<stdio.h>
#include<algorithm>
#include<bitset>
using namespace std;
bitset<>dp[][],w[];
char s[];
char t[];
int main()
{
int tt;
int n,m;
scanf("%d",&tt);
while(tt--)
{
scanf("%d%d",&n,&m);
scanf("%s%s",s,t);
for(int i=;i<;i++)w[i].reset();//由bitset知,reset函数不带参数时将bitset的每一位置为0
for(int i=;i<;i++)
for(int j=;j<;j++)
dp[i][j].reset();
for(int i=;i<n;i++)
{
w[s[i]-'a'][i]=;
}
dp[][]=w[t[]-'a'];
if(m>)dp[][]=w[t[]-'a'];
int now = ;
for(int i=;i<m;i++)
{
now^=;
dp[now][]=(dp[now^][]<<)&w[t[i-]-'a'];
dp[now][]=((dp[now^][]|dp[now^][])<<)&w[t[i]-'a'];
if(i<m-)
{
dp[now][]=((dp[now^][]|dp[now^][])<<)&w[t[i+]-'a'];
}
}
for(int i=;i<n;i++)
{
if(dp[now][][i+m-]||dp[now][][i+m-])printf("");
else printf("");
}
puts("");
}
}