UVALIVE 3026 Period

题意:给你一个字符串,问第i位前是否有循环节,若存在,则循环节是多少?

思路:考察失配函数f[i]的意义。只要i%(i-f[i])==0,则循环节长度为i/(i-f[i])。字符在[0,f[i]],[i-f[i],i]范围内的相等,所以如果存在循环节则每i-f[i]可以分为一段。理解起来比较抽象,模拟一遍。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <cmath>
 4 #include <cstdlib>
 5 #include <iostream>
 6 #include <algorithm>
 7 #include <queue>
 8 #include <map>
 9 #include <vector>
10 #include <time.h>
11 #define clc(a,b) memset(a,b,sizeof(a))
12 using namespace std;
13 const int maxn = 1000010;
14 const int inf=0x3f3f3f3f;
15 typedef long long LL;
16 char P[maxn];
17 int f[maxn];
18
19 int main()
20 {
21     int n,cas=0;
22     while(~scanf("%d",&n),n)
23     {
24         scanf("%s",P);
25         f[0]=0,f[1]=0;
26         for(int i=1;i<n;i++)
27         {
28             int j=f[i];
29             while(j&&P[i]!=P[j])
30                 j=f[j];
31             f[i+1]=(P[i]==P[j]?j+1:0);
32         }
33         printf("Test case #%d\n",++cas);
34         for(int i=2;i<=n;i++)
35         {
36             if(f[i]&&i%(i-f[i])==0)
37                 printf("%d %d\n",i,i/(i-f[i]));
38         }
39         printf("\n");
40     }
41     return 0;
42 }

时间: 2024-10-26 08:29:00

UVALIVE 3026 Period的相关文章

【暑假】[实用数据结构]UVAlive 3026 Period

UVAlive 3026 Period 题目: Period Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Submit Status Description For each prefix of a given string S with N characters (each character has an ASCII code between 97 and 126, inclusive),

UVALive - 3026 - Period (KMP)

UVALive - 3026 Period Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Submit Status 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

Uvalive - 3026 Period (kmp求字符串的最小循环节+最大重复次数)

参考:http://www.cnblogs.com/jackge/archive/2013/01/05/2846006.html 总结一下,如果对于next数组中的 i, 符合 i % ( i - next[i] ) == 0 && next[i] != 0 , 则说明字符串循环,而且 循环节长度为:   i - next[i] 循环次数为:       i / ( i - next[i] ) 1 #include <iostream> 2 #include <cstdi

UVALive 3026 Period (KMP算法简介)

kmp的代码很短,但是不太容易理解,还是先说明一下这个算法过程吧. 朴素的字符串匹配大家都懂,但是效率不高,原因在哪里? 匹配过程没有充分利用已经匹配好的模版的信息,比如说, i是文本串当前字符的下标,j是要匹配的模版串当前正在匹配的字符的下标.(下标都从零开始) 当匹配到i = 4, j = 4的时候失配了,朴素的匹配做法是往右边移一位然后从j开始扫,这样做效率很低. 不难发现前面已经匹配好的串ab是相同的最大前缀后缀.把串移动到后缀的第一个位置正好是 朴素的匹配过程中第一次匹配能把这个前缀匹

Period UVALive - 3026(next数组)

题意: 给出一个长度不超过1000000的字符串S, 对于该字符串的所有前缀求其周期, 如果周期K >= 2输出起始位置是第几个字符和其周期K 解析: 先求next数组 对于每一个位置如果i % (i-next[i]) == 0 && i /(i - next[i]) >= 2 则成立 即i-next[i] 为其最短循环节 周期为i /(i - next[i]) #include <iostream> #include <cstdio> #include

LA 3026 Period (strings)

Period Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Submit Status 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

LA 3026 Period

这只是蓝书上的一道KMP水题...然后对于最长前缀的循环证明我就不说了... #include<iostream> #include<cstring> #include<cstdio> #include<cstdlib> #include<algorithm> #define ll long long #define maxn 1000005 using namespace std; int f[maxn],n; char s[maxn]; in

UVAlive 3026 KMP 最小循环节

KMP算法: 一:next数组:next[i]就是前面长度为i的字符串前缀和后缀相等的最大长度,也即索引为i的字符失配时的前缀函数. 二:KMP模板 1 /* 2 pku3461(Oulipo), hdu1711(Number Sequence) 3 这个模板 字符串是从0开始的 4 Next数组是从1开始的 5 */ 6 #include <iostream> 7 #include <cstring> 8 using namespace std; 9 10 const int m

LA 3026(Period-MP算法)[Template:KMP]

3026 - Period Time limit: 3.000 seconds 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 the prefix is a periodic string. That is, for each i (2 ≤ i ≤ N) w