hdu 1358 KMP next数组的运用

题意:给一个字符串,从第二个字符开始,判断前面的是不是循环串,是的话就输出当前位置和循环次数。

考的是对于next数组的理解和灵活运用,字符编号从0开始,那么if(i%(i-next[i])==0),则i前面的串为一个循环串,其中循环子串出现i/(i-next[i])次。

 1 #include<iostream>
 2 #include<string>
 3 #include<string.h>
 4 #define MAX_N 1000005
 5
 6 using namespace std;
 7
 8 int len;
 9 string s;
10 int nexxt[MAX_N];
11
12 void getNext()
13 {
14     nexxt[0]=-1;
15     int i = 0,j=-1;
16     while(i<=len)
17     {
18         if(j==-1 || s[i]==s[j])
19         {
20             i++,j++;
21             nexxt[i]=j;
22         }
23         else
24             j=nexxt[j];
25     }
26 }
27 int main()
28 {
29     int con = 1;
30     while(cin>>len,len)
31     {
32         cin>>s;
33         printf("Test case #%d\n",con++);
34         getNext();
35         for(int i = 1; i <= len; i++)
36         {
37             if(i%(i-nexxt[i])==0 && i/(i-nexxt[i])>1)
38                 cout<<i<<‘ ‘<<i/(i-nexxt[i])<<endl;
39         }
40         cout<<endl;
41     }
42     return 0;
43 }
时间: 2025-01-07 21:38:11

hdu 1358 KMP next数组的运用的相关文章

HDU 1358 (KMP)

Period Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 5859    Accepted Submission(s): 2844 Problem Description For each prefix of a given string S with N characters (each character has an ASCI

hdu 3336 kmp+next数组应用

分析转自:http://972169909-qq-com.iteye.com/blog/1114968 十分易懂 题意:求字串中[前缀+跟前缀相同的子串]的个数? Sample Input 1 4 abab Sample Output 6 abab:包括2个a,2个ab,1个aba,1个abab 这里要用到next值的意义: next[i]表示前i个字符所组成的字符串的最大前后缀匹配长度 举个例子: next[5]=2, 表示下标5前面那个字符串abcab的前后缀匹配的最大长度是2,显然就是ab

poj1961 &amp; hdu 1358 Period(KMP)

poj 题目链接:http://poj.org/problem?id=1961 hdu题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1358 Description For each prefix of a given string S with N characters (each character has an ASCII code between 97 and 126, inclusive), we want to know whether

HDU 1358 next数组的推移

题目大意: 输入n,再输入一个长度为n的字符串,从第二位开始,计算它的前缀(包括他自己)中出现过的重复字符串的个数,如aabaabaabaab的第6位的前缀aabaab,aab连续出现了两次,所以输出位数i=6,k=2 这个题目要利用next函数求解,不断往前推移,保证往前推移的量能被i整除. 即del=i-next[i]: 保证i%del==0: 其实i%del==0成立之后不用多想了,已经可以保证前面是轮回字符串了 在此稍微进行一下理解,如next[9]=6:那么1,2,3位上的元素可以往前

hdu 3333 树状数组+离线处理

http://acm.hdu.edu.cn/showproblem.php?pid=3333 不错的题,想了很久不知道怎么处理,而且答案没看懂,然后找个例子模拟下别人的代码马上懂了---以后看不懂的话就拿个例子模拟下别人的代码 举个例子:1 3 3 5 3 5 查询 a, 2 4 b, 2 5 最初是这么想的:对于a查询,倘若把第二个数第三个数变成1个3,那么到b查询,又出现了两个3,再做处理似乎还是O(n),而且如果先出现2,5查询,后出现2,4查询,那么还需要把删除的数补回来.....o(╯

Hdu 3887树状数组+模拟栈

题目链接 Counting Offspring Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1757    Accepted Submission(s): 582 Problem Description You are given a tree, it’s root is p, and the node is numbered fr

HDU 1754 树状数组 解法

mnesia在频繁操作数据的过程可能会报错:** WARNING ** Mnesia is overloaded: {dump_log, write_threshold},可以看出,mnesia应该是过载了.这个警告在mnesia dump操作会发生这个问题,表类型为disc_only_copies .disc_copies都可能会发生. 如何重现这个问题,例子的场景是多个进程同时在不断地mnesia:dirty_write/2 mnesia过载分析 1.抛出警告是在mnesia 增加dump

HDOJ3336 Count the string 【KMP前缀数组】+【动态规划】

Count the string Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4212    Accepted Submission(s): 1962 Problem Description It is well known that AekdyCoin is good at string problems as well as n

hdu 1711 KMP模板题

// hdu 1711 KMP模板题 // 贴个KMP模板吧~~~ #include <cstdio> #include <cstring> #include <algorithm> #include <iostream> using namespace std; const int MAX_N = 1000008; const int MAX_M = 10008; int T[MAX_N]; int p[MAX_M]; int f[MAX_M]; int