题目分析:
序列自动机板子题。注意字符串字符均为小写字母,因此我们设一个T数组,T[i][j]表示在i位置右边,离i最近的j+‘a’字母的下标,我们可以从后到前求出T数组。在询问时,需要对每个字符串判断,我们可以利用T数组在主串上进行跳跃匹配。若该字符串利用T数组能匹配到尾部,输出YES,否则输出NO。
时间复杂度:O(26|A|+∑|Bi|)
代码部分:
#include<bits/stdc++.h>
using namespace std;
int T[1000005][26]={0};
char A[1000005];
int main()
{
int i,j,N,L;
scanf("%s%d",A+1,&N);
L=strlen(A+1);
for(i=L;i>=0;i--)
{
for(j=0;j<26;j++)T[i][j]=T[i+1][j];
if(i<L)T[i][A[i+1]-'a']=i+1;
}
while(N--)
{
scanf("%s",A);
for(j=i=0;A[i]!='\0';i++)
{
if(T[j][A[i]-'a'])j=T[j][A[i]-'a'];
else break;
}
A[i]=='\0'?printf("Yes\n"):printf("No\n");
}
return 0;
}
京公网安备 11010502036488号