0/100 发布文章 Zuma
Zuma
这个题其实可以把每种字符只出现一次的限制去掉。
做个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;
}

相关文章:

  • 2021-12-30
  • 2021-06-19
  • 2021-08-05
  • 2022-12-23
  • 2022-12-23
  • 2021-10-23
  • 2021-11-01
  • 2021-12-20
猜你喜欢
  • 2021-11-22
  • 2021-06-19
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-10-29
  • 2022-12-23
相关资源
相似解决方案