这道题首先还原了BWT(T)以后就是KMP了。
至于怎么还原 还是网上找的资料(BWT简介)
其实吧。。若没有资料感觉也是能找出规律的
首先排序求第一列是肯定的(不觉得和后缀数组构造很像?) 之后比一比就能找出来
在不行就根据关系建一建并查集 - -
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2000010;
struct KMP
{
int f[MAXN];
void getFail(char S[])
{
int i=0,j=-1;
int len=strlen(S);
f[0]=-1;
while (i<len)
{
if (j==-1||S[i]==S[j])
{
i++,j++;
f[i]=j;
}
else
j=f[j];
}
}
///Whether S is a substring of T
///Or whether T has S;
int beat(char T[],char S[])
{
int i=0,j=0;
int n=strlen(T);
int m=strlen(S);
getFail(S);
while(i<n)
{
if(j==-1||T[i]==S[j])
i++,j++;
else
j=f[j];
if(j==m)
return 1;
}
return 0;
}
}soul;
char in[MAXN],s[MAXN],t[MAXN];
int pos[MAXN];
bool cmp(int a,int b)
{
return in[a]<in[b];
}
int main()
{
while(scanf("%s",in)!=EOF)
{
int n,u;
n=strlen(in);
for(int i=0;i<n;i++)
{
pos[i]=i;
if(in[i]=='$')
u=i;
}
stable_sort(pos,pos+n,cmp);
n=0;
do
{
u=pos[u];
s[n++]=in[u];
}while(in[u]!='$');
s[n]=0;
scanf("%d",&n);
while(n--)
{
scanf("%s",t);
puts(soul.beat(s,t)?"YES":"NO");
}
}
return 0;
}