题目的意思是,任意相邻的两个字母都可以交换,你可以交换一组,也可以多组。这样一来,有关相邻的所有p的变形串也几乎都能被生成出来了。
这题做起来挺气人的!大家都是两个for循环O(nm)暴力过的……昨天比赛的时候写的是所以直接判断一下s子串,s[k]能否与p[j],p[j-1],p[j+1]中的一个相匹配,再check一下p串字母被匹配的次数。 O(n*(26+m)),无情TLE。
今天网上搜下题解,我勒个艹,思路是一样的,写的比我复杂多了,for里面的东西比我还多,结果AC了。
昨晚躺床上想了一下,可以不用check使用的次数。只要从左到右顺序匹配过去就可以了,具体看代码。
但是一开始又是无情WA好几次!!!
/* ***********************************************
Author :angon
************************************************ */
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <stack>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
#define REP(i,k,n) for(int i=k;i<n;i++)
#define REPP(i,k,n) for(int i=k;i<=n;i++)
#define scan(d) scanf("%d",&d)
#define scann(n,m) scanf("%d%d",&n,&m)
#define mst(a,k) memset(a,k,sizeof(a));
#define LL long long
#define maxn 1005
#define mod 100000007
char s[100005],p[100005];
//int vis[27],vis2[27];
int main()
{
//freopen("1012.txt","r",stdin);
// freopen("out.txt","w",stdout);
int t,n,m,flag;
scan(t);
while(t--)
{
scann(n,m);
scanf("%s %s",s,p);
for(int i=0;i<n-m+1;i++)
{
flag=0;
for(int j=0,k=i;j<m;j++,k++)
{
if(s[k]==p[j])
{
continue;
}
else if(s[k]==p[j+1] && s[k+1]==p[j])
{
k++;j++;
}
//else if(j>=1 && s[k]==p[j-1] && s[k-1]==p[j])
//{
// 把第55行去掉加62行会错,但没想出来会错的例子,唉。
// }
else
{
putchar('0');
flag=1;
break;
}
}
if(!flag)
putchar('1');
}
for(int i=n-m+1;i<n;i++)
putchar('0');
putchar('\n');
}
return 0;
}