HDU 3746 Cyclic Nacklace 环形项链(KMP,循环节)

题意:给一个字符串,问:要补多少个字符才能让其出现循环?比如abc要补3个变成abcabc。若已经循环,输出0。

思路:KMP的next数组解决。如果已经出现循环,那么答案为0。但是不循环呢?要根据next[len]来断定。我们要用最少字符来补上使其循环,而我们所知的就是要令循环节为k=len-next[len]这么长,即串开头的这么长。补到串长为k的倍数为止,此时,k就是循环节了。

  其实答案可以直接算的,我用个循环来找而已。直接算应该是len%k后剩下末尾那小串的长度,补k-len%k这么多个就行了,就能将末尾不够k个的凑够k个啦。

  只是要特别注意len%len-next[len]为0的情况,有可能连个循环节都没有!那就把串翻倍。

 1 #include <bits/stdc++.h>
 2 #define LL long long
 3 #define pii pair<int,int>
 4 #define INF 0x7f7f7f7f
 5 using namespace std;
 6 const int N=100010;
 7 char str[N];
 8 int _next[N];
 9
10 void get_next(int len)
11 {
12     _next[0]=-1;
13     int i=0, j=-1;   //模式串
14     while(i<len)
15     {
16         if(j==-1||str[j]==str[i])   _next[++i]=++j;
17         else    j=_next[j];
18     }
19 }
20
21 int main()
22 {
23     freopen("input.txt", "r", stdin);
24     int t, len=0;
25     cin>>t;
26     while(t--)
27     {
28         scanf("%s",str);
29         get_next(len=strlen(str));
30         if(_next[len]==0)    printf("%d\n",len);       //这是没有循环节的情况
31         else if(len%(len-_next[len])==0) puts("0");  //有循环了
32         else    //整串不循环,补字符凑循环
33         {
34             int i=1;
35             while( i<len && (len+i)%(len-_next[len])!=0)   i++;//尝试在后面添加匹配的字符,最长不超len
36             printf("%d\n", i);
37         }
38     }
39     return 0;
40 }

AC代码

时间: 2024-11-03 22:32:10

HDU 3746 Cyclic Nacklace 环形项链(KMP,循环节)的相关文章

hdu 3746 Cyclic Nacklace (KMP求最小循环节)

//len-next[len]为最小循环节的长度 # include <stdio.h> # include <algorithm> # include <string.h> using namespace std; int len; char a[100010]; int next[100010]; void Getnext() { int i=0,j=-1; next[0]=-1; while(i<=len) { if(j==-1||a[i]==a[j]) i

(KMP 1.4)hdu 3746 Cyclic Nacklace(使用next数组来求循环节的长度——求一个字符串需要添加多少个字符才能使该字符串的循环节的个数&gt;=2)

题目: Cyclic Nacklace Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3387    Accepted Submission(s): 1549 Problem Description CC always becomes very depressed at the end of this month, he has che

模板题 + KMP + 求最小循环节 --- HDU 3746 Cyclic Nacklace

Cyclic Nacklace Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=3746 Mean: 给你一个字符串,让你在后面加尽量少的字符,使得这个字符串成为一个重复串. 例: abca---添加bc,成为abcabc abcd---添加abcd,成为abcdabcd aa---无需添加 analyse: 经典的求最小循环节. 首先给出结论:一个字符串的最小循环节为:len-next[len]. 证明: 举个例子:abcab

hdu 3746 Cyclic Nacklace KMP循环节问题

Cyclic Nacklace Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4124    Accepted Submission(s): 1866 Problem Description CC always becomes very depressed at the end of this month, he has checke

hdu 3746 Cyclic Nacklace KMP

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=3746 题目: 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

HDU 3746 Cyclic Nacklace (KMP 循环节)

分析:对next数组的深入理解,最重要的还是对最小循环节的处理. #include <stdio.h> #include <string.h> int next[100005]; char str2[100005]; void build_next(int len2) { int i=0,j=-1; next[0] = -1; while (i < len2) { if (j==-1 || str2[i] == str2[j]) { i++; j++; // if (str2

HDU 3746 Cyclic Nacklace (KMP最小循环节)

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 check

HDU 3746 Cyclic Nacklace (KMP找循环节)

题目链接:HDU 3746 Sample Input 3 aaa abca abcde Sample Output 0 2 5 Author possessor WC Source HDU 3rd "Vegetable-Birds Cup" Programming Open Contest Solution 题意 给定一个字符串,问至少需要在末尾添加多少个字符使得字符串循环. 思路 KMP 设前缀函数为 \(\pi()\),字符串长度为 \(n\),下标从 \(1\) 开始. 最小循环

HDU - 3746 Cyclic Nacklace (KMP求循环节)

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 inspir