hdoj 3746(kmp)
Posted zquacm-875180305
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdoj 3746(kmp)相关的知识,希望对你有一定的参考价值。
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3746
题意:要求字符串形成两遍的循环。
3
aaa -> 已经形成循环,所以不需要添加珠子
abca -> abc为一个循环,需要添加两个珠子
abcde -> 以abcde为一个循环,需要再添加一个abcde
思路:直接利用kmp构造出的next函数。
1 #include<cstdio> 2 #include<cstring> 3 using namespace std; 4 int n; 5 char a[100600]; 6 int next[100600]; 7 8 void get_next() 9 { 10 next[0]=-1; 11 int tmp=-1,i=0; 12 while(i!=n){ 13 if(tmp==-1 || a[i]== a[tmp]) 14 next[++i]=++tmp; 15 else 16 tmp=next[tmp]; 17 } 18 } 19 20 int main() 21 { 22 int T; 23 scanf("%d",&T); 24 while(T--){ 25 scanf("%s",a); 26 n=strlen(a); 27 get_next(); 28 int length=n-next[n]; 29 // printf("%d %d %d ",n,length,next[n]); 30 if(n!=length&&n%length==0) 31 printf("0 "); 32 else{ 33 int ans=length-next[n]%length; 34 printf("%d ",ans); 35 } 36 } 37 return 0; 38 }
以上是关于hdoj 3746(kmp)的主要内容,如果未能解决你的问题,请参考以下文章
Cyclic Nacklace HDU 3746 KMP 循环节