D - Cyclic Nacklace HDU-3746

题目大意:

给一个t,接下来每个t,给一个串,求出最小循环节下还要增加多少个珠子才完美。(要是都没啥循环节,就输出长度)

解题思路:

求出最小循环节 cir:cir=len - next[len] (关于为什么是这个式子详见《KMP 专题知识》),然后拿len%cir得到的余数就是已经有的,那么拿循环节再减掉有的,就是需要增加的。即:cir-len%cir。如果len%cir == 0,而且cir!=len,就意味着一颗都不用增加,因为此时已经是完美的循环了,但是要是cir==len,就说明没有所谓的循环节,就要加len颗。

参考代码:

 1 #include <iostream>
 2 #include <vector>
 3 #include <map>
 4 #include <string>
 5 #include <queue>
 6 #include <stack>
 7 #include <set>
 8 #include <algorithm>
 9
10 #include <cstdio>
11 #include <cstring>
12 #include <cmath>
13 #include <cstdlib>
14 using namespace std;
15
16 const int INF=0x3f3f3f3f;
17 const int SIZE=10000;
18 typedef long long LL;
19
20 char b[100005];
21 int nextt[100005];
22 void nexxt()
23 {
24     memset(nextt,0,sizeof(nextt));
25     int j=0,k=-1;
26     nextt[0]=-1;
27     int len=strlen(b);
28     while(j<len)
29     {
30         if(k==-1||b[j]==b[k])
31         {
32             k++;
33             j++;
34             nextt[j]=k;
35         }
36         else
37             k=nextt[k];
38     }
39 }
40
41 int main()
42 {
43     int t;
44     scanf("%d",&t);
45     getchar();
46     while(t--)
47     {
48          gets(b);
49          int len=strlen(b);
50          nexxt();
51          int cir=len-nextt[len];
52          if(len%cir==0&&cir!=len)
53             printf("0\n");
54          else
55              printf("%d\n",cir-nextt[len]%cir);
56
57     }
58     return 0;
59 }

时间: 2024-11-12 14:37:24

D - Cyclic Nacklace HDU-3746的相关文章

Cyclic Nacklace HDU 3746 KMP 循环节

Cyclic Nacklace HDU 3746 KMP 循环节 题意 给你一个字符串,然后在字符串的末尾添加最少的字符,使这个字符串经过首尾链接后是一个由循环节构成的环. 解题思路 next[len]-len的差即是循环部分的长度. 这个是重点.这个题目自己开始没有想明白,看的博客,推荐这个. 代码实现 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const i

(KMP扩展 利用循环节来计算) Cyclic Nacklace -- hdu -- 3746

http://acm.hdu.edu.cn/showproblem.php?pid=3746 Cyclic Nacklace Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4498    Accepted Submission(s): 2051 Problem Description CC always becomes very dep

Cyclic Nacklace HDU - 3746

给你一个字符串,要求将字符串的全部字符最少循环2次需要添加的字符数. 没有优化的next数组的应用. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<string> #define maxn 100010 using namespace std; char p[maxn]; int nex[maxn],n; void get_ne

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 + 求最小循环节 --- 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

(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

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): 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最小循环节)

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

Match:Cyclic Nacklace(kmp的next数组的高级应用)(HDU 3746)

串珠子 题目大意:给定一个字串,要你找到如果要使之成为循环串,在末尾需要的最小的字数(只能添加字符,不能删减字符) 首先联动一下之前做过的动态规划问题POJ 3280,当然了3280这一题是用的LD,因为他可以添加或者删除(加上修改也行,但是要改状态方程了) 而我们现在要讨论的这一题(HDU 3746)是有限制的,首先它只能添加不能删除,其次一定是要在末尾添加. 其实这样的题用kmp可以很快地解决,其实这样的题目是循环节的题目,之前我已经写过很多了,这一题是对循环节的深刻理解. 首先我们我们明白