版权声明:未经过同意不得转载 https://blog.csdn.net/qq_42500298/article/details/88649956
0/100 发布文章
这个题其实可以把每种字符只出现一次的限制去掉。
做个KMP,用一个栈记一下当前 s 的所有匹配位置。完成一次匹配就把栈里面最后 |p| 个状态退掉,从栈顶的状态继续做。
#include <bits/stdc++.h>
using namespace std;
char s[1000010],p[40];
int sta[1000010],top,k[1000010],f[45];
int main(){
scanf("%s%s",s+1,p+1);
int len1=strlen(s+1),len2=strlen(p+1);
int j=0;
f[1]=0;
for (int i=2;i<=len2;i++){
while (j&&p[i]!=p[j+1]) j=f[j];
if (p[j+1]==p[i]) j++;
f[i]=j;
}
k[top]=0;
for (int i=1;i<=len1;i++){
j=k[top];
while (j&&s[i]!=p[j+1]) j=f[j];
if (p[j+1]==s[i]) j++;
sta[++top]=s[i];
k[top]=j;
if (k[top]==len2) top-=len2;
}
if (!top) printf("ZUMA");
else for (int i=1;i<=top;i++) cout<<char(sta[i]);
return 0;
}