您的位置:首页 > 其它

HDU 3746利用KMP找循环节

2013-11-01 20:06 489 查看
题意大致是问给一个序列后面补充几个元素使其恰能成为几个重复循环的序列。

aaa最小循环节是1,3个循环所以补充0个元素,abca循环节是3,应补充2个元素,abcde则循环节为5,补充5个元素,至于循环节的求法,是向wuyiqi巨巨学习的,膜拜下。。

/article/2711374.html



/**********************

* author:crazy_石头

* Pro:HDOJ 3746-Cyclic Nacklace

* algorithm: KMP

* Judge Status:Accepted

* Memory:728K

* Time:125ms

* date:2013/11/01

***********************/

#include <iostream>

#include <cstdlib>

#include <cstdio>

#include <cstring>

using
namespace std;

#define rep(i,h,n) for(int i=(h);i<=(n);i++)

const
int maxn=200000+5;

int next[maxn];

char p[maxn];

int n,test;//主串的串长;

inline
void getNext(char *p,int *next)

{

int i,j;

i=0,j=-1;

next[0]=-1;

int m=strlen(p);

while(i<m)

{

if(j==-1||p[i]==p[j])

i++,j++,next[i]=j;

else

j=next[j];

}

}

int main()

{

scanf("%d",&test);

while(test--)

{

scanf("%s",p);

getNext(p,next);

int len=strlen(p);

int res=len-next[len];//最小循环节的值res=len-next[len];

if(len%res==0&&res!=len)

printf("%d\n",0);//凑够了几个循环则不必再补元素,输出0;

else

printf("%d\n",res-len%res);//不能整除的时候补res-len%res个元素;

}

return
0;

}

* This source code was highlighted byYcdoiT. ( style:
Borland )
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: