Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
46183 | wsad | 【模拟赛3】无限复制 ZBN 是 MJ ? | C++ | 解答错误 | 80 | 274 MS | 388 KB | 922 | 2022-02-28 12:58:31 |
#include<bits/stdc++.h> using namespace std; const int M=1000010; int k,Next[M]; //长度从k开始 char s[M],t[M]; bool T[30]; void GetNext(int n){ Next[1]=0; for(int i=2,j=0;i<=n;++i) { for(;j>0 && t[i]!=t[j+1];j=Next[j]); if(t[i]==t[j+1]) ++j; Next[i]=j; } return ; } bool KMP(int m,int n){ int r=m,a=n-n%m; //a为完整串 for(int i=m+1,j=0;i<=a;++i) { for(;j>0 && s[i]!=t[j+1];j=Next[j]); if(s[i]==t[j+1]) ++j; if(j==m) { if( (i-j)!=r ) return 0; r=i; } } for(int i=a+1,j=1;i<=n;++j,++i) if(s[i]!=t[j]) return 0; return 1; } int main(){ int l; cin>>l; getchar(); for(int i=1;i<=l;++i) { cin>>s[i]; if(!T[s[i]-'a']) k=i,T[s[i]-'a']=1; } for(int i=1;i<=k;++i) t[i]=s[i]; for(int i=k;i<=l;++i) { GetNext(i),t[i]=s[i]; if(KMP(i,l)) { cout<<i<<'\n'; return 0; } } return 0; }