题意:一个字符串s,t个字符串p,判断p是不是s的子序列
预处理出对于字符串s,每个位置i之后第一个字母x的位置,匹配子序列的时候就相当于在母串上往后跳,如果跳到母串末尾,子序列还没有结束,匹配失败。
然而!超时了QAQ,只能过八组样例,网上也只能找到过九组的,,,希望有哪位大神路过指点一下了
int tag[33],nxt[MAXN][30];
char s[MAXN],p[MAXN];
void init()
{
int n=strlen(s);
for(int j=0;j<='z'-'a';++j) tag[j]=n;
for(int i=n-1;i>=0;--i)
{
rep(j,'z'-'a'+1) nxt[i][j]=tag[j];
tag[s[i]-'a']=i;
}
}
signed main()
{
scanf("%s",s);init();
int t;scanf("%d",&t);
while(t--)
{
scanf("%s",p);
int k=0,flag=1,n=strlen(p);
rep(i,n)
{
if(i==0) k=tag[p[i]-'a'];
else k=nxt[k][p[i]-'a'];
if(k==(int)strlen(s)) {flag=0;break;}
}
if(flag) puts("YES");
else puts("NO");
}
return 0;
}
原文地址:https://www.cnblogs.com/Herlo/p/12203333.html
时间: 2024-11-05 18:28:19