1. 程式人生 > >HDU 3746 Cyclic Nacklace (KMP最小循環節)

HDU 3746 Cyclic Nacklace (KMP最小循環節)

eve case blog nac dea ctr 技術分享 -a desc

Cyclic Nacklace Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 11264 Accepted Submission(s): 4821 Problem Description CC always becomes very depressed at the end of this month, he has checked his credit card yesterday, without any surprise, there are only 99.9 yuan left. he is too distressed and thinking about how to tide over the last days. Being inspired by the entrepreneurial spirit of "HDU CakeMan", he wants to sell some little things to make money. Of course, this is not an easy task. As Christmas is around the corner, Boys are busy in choosing christmas presents to send to their girlfriends. It is believed that chain bracelet is a good choice. However, Things are not always so simple, as is known to everyone, girl‘s fond of the colorful decoration to make bracelet appears vivid and lively, meanwhile they want to display their mature side as college students. after CC understands the girls demands, he intends to sell the chain bracelet called CharmBracelet. The CharmBracelet is made up with colorful pearls to show girls‘ lively, and the most important thing is that it must be connected by a cyclic chain which means the color of pearls are cyclic connected from the left to right. And the cyclic count must be more than one. If you connect the leftmost pearl and the rightmost pearl of such chain, you can make a CharmBracelet. Just like the pictrue below, this CharmBracelet‘s cycle is 9 and its cyclic count is 2: 技術分享圖片
Now CC has brought in some ordinary bracelet chains, he wants to buy minimum number of pearls to make CharmBracelets so that he can save more money. but when remaking the bracelet, he can only add color pearls to the left end and right end of the chain, that is to say, adding to the middle is forbidden. CC is satisfied with his ideas and ask you for help. Input The first line of the input is a single integer T ( 0 < T <= 100 ) which means the number of test cases. Each test case contains only one line describe the original ordinary chain to be remade. Each character in the string stands for one pearl and there are 26 kinds of pearls being described by ‘a‘ ~‘z‘ characters. The length of the string Len: ( 3 <= Len <= 100000 ). Output For each case, you are required to output the minimum count of pearls added to make a CharmBracelet. Sample Input 3 aaa abca abcde
Sample Output 0 2 5 題意:給你一串字符,你需要回答至少需要增加多少個字符,可以使這個字符串變成由它的子串周期循環而形成的字符串。 例如aaa 它本身就是一個由子串a周期循環成的字符串,所以不需要添加任何字符,答案為0 例如aba 對於它,只需要添加一個字符b它就成了以子串ab周期循環成的字符串。所以,答案為1 一個字符串的最小循環節需要得到該字符串的KMP next數組。 該字符串的最小循環節為:len-next[len] 註明:len為該字符串長度 如果len==len-next[len] 說明字符串的最小循環節長度就是該字符串的長度 如果len%(len-next[len])==0且len!=(len-next[len])說明字符串的長度恰好是最小循環節的長度,不用添加任何字符,它本身就是由最小循環節子串周期循環成的字符串
其他情況下只需要計算再補充多少個字符可以使該字符串成為最小循環節長度的倍數然後輸出即可 接下來的題解可以參考:http://blog.csdn.net/HHH_go_/article/details/70143425 題解代碼則可以參考:http://blog.csdn.net/my_stage/article/details/51084933 技術分享圖片
 1 #include<stdio.h>
 2 #include<string.h>
 3 const int maxn=100010;
 4 
 5 int getnext(char str[maxn],int next[maxn])
 6 {
 7     int j=0,k=-1,m=strlen(str);
 8     next[0]=-1;
 9     while(j<m)
10     {
11         if(k==-1||str[j]==str[k])
12         {
13             j++;
14             k++;
15             next[j]=k;
16         }
17         else
18             k=next[k];
19     }
20     return m;
21 }
22 
23 int main()
24 {
25     int T,next[maxn];
26     char str[maxn];
27     scanf("%d",&T);
28     while(T--)
29     {
30         scanf("%s",str);
31         int m=getnext(str,next);
32         if(next[m]!=0&&(m%(m-next[m])==0))
33             printf("0\n");
34         else
35             printf("%d\n",(m-next[m])-m%(m-next[m]));
36     }
37     return 0;
38 }
View Code

HDU 3746 Cyclic Nacklace (KMP最小循環節)