<pre name="code" class="cpp">//TLE版
bool dp[N][2][3];
void work(){
scanf("%d%d",&n,&m);
scanf("%s%s",str+1,p+1);
int Now=0,Next=1;
for (int i=0;i<=n-m+1;i++)dp[i][0][0]=1,dp[i][0][1]=dp[i][0][2]=0;
for (int j=1;j<=m;j++){
for (int i=1;i<=n;i++){
if (str[i]==p[j-1])dp[i][Next][0]=dp[i-1][Now][2];else dp[i][Next][0]=0;
if (str[i]==p[j]) dp[i][Next][1]=dp[i-1][Now][0]|dp[i-1][Now][1];else dp[i][Next][1]=0;
if (j<m && str[i]==p[j+1])dp[i][Next][2]=dp[i-1][Now][0]|dp[i-1][Now][1];else dp[i][Next][2]=0;
}
Now^=1,Next^=1;
}
for (int i=1;i<=n-m+1;i++)printf("%d",dp[i+m-1][Now][0]|dp[i+m-1][Now][1]|dp[i+m-1][Now][2]);
for (int i=n-m+2;i<=n;i++)printf("0");puts("");
}
//AC版
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <bitset>
using namespace std;
typedef long long LL;
const int M=1000000007;
const int N=1e5+10;
char str[N],p[5555];
int n,m;
bitset<N>dp[2][3],y[26];
void work(){
scanf("%d%d",&n,&m);
scanf("%s%s",str+1,p+1);
for (int i=0;i<26;i++)for (int j=1;j<=n;j++)y[i][j]=(str[j]-'a'==i)?1:0;
int Now=0,Next=1;
dp[0][0].set();dp[0][1].reset();dp[0][2].reset();
for (int j=1;j<=m;j++){
if (j>1)dp[Next][0]=(dp[Now][2]<<1)&y[p[j-1]-'a'];else dp[Next][0].reset();
dp[Next][1]=((dp[Now][0]<<1)|(dp[Now][1]<<1))&y[p[j]-'a'];
if (j<m)dp[Next][2]=((dp[Now][0]<<1)|(dp[Now][1]<<1))&y[p[j+1]-'a'];else dp[Next][2].reset();
Now^=1,Next^=1;
}
for (int i=1;i<=n-m+1;i++)printf("%d",dp[Now][0][i+m-1]|dp[Now][1][i+m-1]|dp[Now][2][i+m-1]);
for (int i=n-m+2;i<=n;i++)printf("0");puts("");
}
int main()
{
//freopen("1.txt","r",stdin);
int Case;scanf("%d",&Case);
while (Case--)work();
return 0;
}
题解参考http://bestcoder.hdu.edu.cn/blog/
2016 Multi-University Training Contest 2 solutions BY zimpha