题意大致是问给一个序列后面补充几个元素使其恰能成为几个重复循环的序列。
aaa最小循环节是1,3个循环所以补充0个元素,abca循环节是3,应补充2个元素,abcde则循环节为5,补充5个元素,至于循环节的求法,是向wuyiqi巨巨学习的,膜拜下。。
http://blog.csdn.net/u012350533/article/details/14005637
/********************** * 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 )