Codeforces 432D Prefixes and Suffixes kmp
手动转田神的大作:http://blog.csdn.net/tc_to_top/article/details/38793973
D. Prefixes and Suffixes
You have a string s = s1s2...s|s|, where |s| is the length of string s, and si its i-th character.
Let's introduce several definitions:
- A substring s[i..j] (1 ≤ i ≤ j ≤ |s|) of string s is string sisi + 1...sj.
- The prefix of string s of length l (1 ≤ l ≤ |s|) is string s[1..l].
- The suffix of string s of length l (1 ≤ l ≤ |s|) is string s[|s| - l + 1..|s|].
Your task is, for any prefix of string s which matches a suffix of string s, print the number of times it occurs in string s as a substring.
The single line contains a sequence of characters s1s2...s|s| (1 ≤ |s| ≤ 105) — string s. The string only consists of uppercase English letters.
In the first line, print integer k (0 ≤ k ≤ |s|) — the number of prefixes that match a suffix of string s. Next print k lines, in each line print two integers lici. Numbers li ci mean that the prefix of the length li matches the suffix of length li and occurs in string s as a substring ci times. Print pairs li ci in the order of increasing li.
ABACABA
3
1 4
3 2
7 1
AAA
3
1 3
2 2
3 1
1 #include <cstdio> 2 #include <cstring> 3 int const MAX = 1e5 + 2; 4 char str[MAX]; 5 int next[MAX], re[MAX], le[MAX], sub[MAX];; 6 int len, count; 7 8 void get_next() 9 { 10 int i = 0, j = -1; 11 next[0] = -1; 12 while(str[i] != '\0') 13 { 14 if(j == -1 || str[i] == str[j]) 15 { 16 j++; 17 i++; 18 next[i] = j; 19 } 20 else 21 j = next[j]; 22 } 23 } 24 25 void kmp() 26 { 27 get_next(); 28 len = strlen(str); 29 memset(re,0,sizeof(re)); 30 for(int i = 1; i <= len; i++) 31 re[i] = 1; 32 int temp = len; 33 for(; temp > 0; temp--) 34 if(next[temp]) 35 re[ next[temp] ] += re[temp]; 36 count = 0; 37 le[count] = len; 38 sub[count++] = 1; 39 len = next[len]; 40 while(len) 41 { 42 le[count] = len; 43 sub[count++] = re[len]; 44 len = next[len]; 45 } 46 } 47 48 int main() 49 { 50 while(scanf("%s", str) != EOF) 51 { 52 kmp(); 53 printf("%d\n",count); 54 for(int i = count - 1; i >= 0; i--) 55 printf("%d %d\n",le[i], sub[i]); 56 } 57 }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步