Zuma

版权声明:未经过同意不得转载 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;
}

猜你喜欢

转载自blog.csdn.net/qq_42500298/article/details/88649956