https://vjudge.net/contest/170300#problem/C
char s[maxn];
int nxt[maxn];
int cnt[maxn];
int vis[maxn];
int main(){
int n,q;
sf("%d%d",&n,&q);
sf("%s",s);
int i,k=0;
for(i=1;i<n;++i){
while(k>0&&s[i]!=s[k])k=nxt[k-1];
if(s[i]==s[k])k++;
nxt[i]=k;
}
while(q--){
int op;sf("%d",&op);
if(op==1){
sf("%s",s+n);
n++;
while(k>0&s[i]!=s[k])k=nxt[k-1];
if(s[i]==s[k])k++;
nxt[i]=k;
cnt[++i]=cnt[k];//即是原来的 n+1, 反正就是那个位置的满足后缀数
}else if(op==2){
if(!vis[i]){
vis[i]=1;
cnt[i]++;
}
}else{
pf("%d\n",cnt[n]);
}
}
}
本文介绍了一种字符串匹配算法的实现过程,通过一个具体的程序代码示例来解释如何使用前后缀数组进行模式串的匹配,并展示了如何处理不同类型的查询操作。
1251

被折叠的 条评论
为什么被折叠?



