KMP。
怎么描述做法呢。。。“持久化”一下?
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define maxn 1000050 using namespace std; char s[maxn],t[maxn]; int l1,l2,nxt[maxn],pre[maxn],aft[maxn],ts[maxn]; bool flag[maxn]; void get_nxt() { int cnt=0; for (int i=2;i<=l1;i++) { while (cnt && s[cnt]!=s[i-1]) cnt=nxt[cnt]; if (s[cnt]==s[i-1]) cnt++; nxt[i]=cnt; } for (int i=0;i<=l2;i++) pre[i]=i-1,aft[i]=i+1; aft[l2-1]=-1; } void kmp() { int cnt=0; for (int i=0;i<l2;i++) { while (cnt && s[cnt]!=t[i]) cnt=nxt[cnt]; if (s[cnt]==t[i]) cnt++; ts[i]=cnt; if (cnt==l1) { int now=i; for (int j=1;j<=l1;j++) { flag[now]=true; now=pre[now]; } cnt=ts[now];pre[i+1]=now; } } } int main() { scanf("%s",t);l2=strlen(t); scanf("%s",s);l1=strlen(s); get_nxt(); kmp(); for (int i=0;i<l2;i++) if (!flag[i]) printf("%c",t[i]); printf("\n"); return 0; }