字符串周期--hdu 3746 Cyclic Nacklace
生活随笔
收集整理的這篇文章主要介紹了
字符串周期--hdu 3746 Cyclic Nacklace
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
通過這題得出了一個很重要的結論,在用kmp算法求出next數組后,len-next[len]的值就是該字符串的最小循環節,該字符串的其他循環節都是它的倍數,如果len恰好是len-next[len]的整數倍,那么該字符串就是個power string;如果next[len]為0,表示該字符串是非循環的;否則,按照len-next[len]的循環節,補齊最后一個循環節即為使該字符串成為power string的最小添加字符個數
思路:kmp+字符串的最小循環節問題
分析:
1 題目要求的是給定一個字符串,問我們還需要添加幾個字符可以構成一個由n個循環節組成的字符串。
2 可知我們應該先求出字符串的最小循環節的長度:假設字符串的長度為len,那么最小的循環節就是t = len-next[len] ; 如果有len%t == 0,那么這個字符串就是已經是完美的字符串,不用添加任何字符;如果不是完美的那么需要添加的字符數就是cir - (len-(len/t)*t)),相當與需要在最后一個循環節上面添加幾個。
3 如果t = 1,說明字符串只有一種字符例如“aaa” ; 如果t = m說明最小的循環節長度為m,那么至少還需m個;如果m%t == 0,說明已經不用添加了。
#include<stdio.h> #include<string.h> int next[100005]; char str[100005]; int len; void getnext() {int i,j=0;next[1]=0;for(i=2;i<=len;i++){while(j>0&&str[i]!=str[j+1])j=next[j];if(str[i]==str[j+1])j++;next[i]=j;} } int main() {int i,j,t,n;scanf("%d",&n);while(n--){ scanf("%s",str+1);len=strlen(str+1);memset(next,0,sizeof(next));getnext();t=len-next[len];if(t!=len&&len%t==0)puts("0");elseprintf("%d\n",t-next[len]%t);}return 0; }
總結
以上是生活随笔為你收集整理的字符串周期--hdu 3746 Cyclic Nacklace的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: noj Nightmare
- 下一篇: Hud 敌兵布阵 --线段树的插点问线