您的位置:首页 > 其它

[kuangbin带你飞]专题十六 KMP & 扩展KMP & Manacher G POJ 2406

2016-11-03 19:09 381 查看
题目地址:https://vjudge.net/contest/70325#problem/G

思路:题目看错了也是很尴尬。给你一个s串,问你s串作为一串完整循环过得串,最多循环了多少次。先求出最小循环节,然后判断是否完整循环即可。

AC代码:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=1000000+10;
char t[maxn];
int tlen,Next[maxn];

void getNext()
{
int j,k;
j=0,k=-1,Next[0]=-1;
while(j<tlen)
{
if(k==-1 || t[k]==t[j])
Next[++j]=++k;
else
k=Next[k];
}
}

int main()
{
while(scanf("%s",t))
{
if(t[0]=='.')
break;
tlen=strlen(t);
getNext();
int ans=tlen-Next[tlen];
if(ans!=tlen && tlen%ans==0)
printf("%d\n",tlen/ans);
else
printf("1\n");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: