您的位置:首页 > 其它

UVALive - 3026:Period

2017-11-27 14:01 344 查看
用KMP里面的next数组即可,原理就是next数组的原理

#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<vector>
#define MAXN 1000000+10
#define ll long long
using namespace std;
char s[MAXN];
int n;
int nxt[MAXN];
void solve(){
scanf("%s",s+1);
memset(nxt,0,sizeof(nxt));
nxt[1]=0;
int k=0;
for(int i=2;i<=n;i++){
while(k&&s[k+1]!=s[i])k=nxt[k];
if(s[k+1]==s[i])k++;
nxt[i]=k;
if(nxt[i]&&i%(i-nxt[i])==0){
printf("%d %d\n",i,i/(i-nxt[i]));
}
}
}
int main()
{
//    freopen("data.in","r",stdin);
int T=0;
while(1){
scanf("%d",&n);
if(!n)break;
printf("Test case #%d\n",++T);
solve();
printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: