Codeforces 432D Prefixes and Suffixes (next数组的应用)
2017-08-07 16:30
453 查看
D. Prefixes and Suffixes
time limit per test
1:second
memory limit per test:
256 megabytes
input:
standard input
output:
standard output
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.
Input
The single line contains a sequence of characters s1s2...s|s| (1 ≤ |s| ≤ 105) —
string s. The string only consists of uppercase English letters.
Output
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.
Sample test(s)
input
output
input
output
题目链接 :http://codeforces.com/problemset/problem/432/D
题目大意 :给一个字符串,求其前缀等于后缀的子串,输出子串的长度和其在原串中出现的次数,子串长度要求增序输出
题目分析 :首先得到母串的next数组,next数组的含义是next[j]的值表示str[0...j-1](我的next[0]是-1)这个子串的前后缀匹配的最长长度,如样例1
index 0 1 2 3 4 5 6 7
str A B A C A B A
next -1 0 0 1 0 1 2 3
next[6] = 2即ABACAB这个子串的前后缀最长匹配是2(AB)
由此性质我们可以发现满足条件的子串即是next[next[len。。。]]不断往前递归直到为0,因为长的可能会包含短的,我们可以递归得到re数组(re记录的就是子串出现的次数)re数组的递归式为re[next[i]] += re[i];
time limit per test
1:second
memory limit per test:
256 megabytes
input:
standard input
output:
standard output
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.
Input
The single line contains a sequence of characters s1s2...s|s| (1 ≤ |s| ≤ 105) —
string s. The string only consists of uppercase English letters.
Output
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.
Sample test(s)
input
ABACABA
output
3 1 4 3 2 7 1
input
AAA
output
3 1 3 2 2 3 1
题目链接 :http://codeforces.com/problemset/problem/432/D
题目大意 :给一个字符串,求其前缀等于后缀的子串,输出子串的长度和其在原串中出现的次数,子串长度要求增序输出
题目分析 :首先得到母串的next数组,next数组的含义是next[j]的值表示str[0...j-1](我的next[0]是-1)这个子串的前后缀匹配的最长长度,如样例1
index 0 1 2 3 4 5 6 7
str A B A C A B A
next -1 0 0 1 0 1 2 3
next[6] = 2即ABACAB这个子串的前后缀最长匹配是2(AB)
由此性质我们可以发现满足条件的子串即是next[next[len。。。]]不断往前递归直到为0,因为长的可能会包含短的,我们可以递归得到re数组(re记录的就是子串出现的次数)re数组的递归式为re[next[i]] += re[i];
#include <cstdio> #include <cstring> int const MAX = 1e5 + 5; char s[MAX]; int next[MAX]; int len, pos, num; int l[MAX], cnt[MAX], re[MAX]; void get_next() { int i = 0, j = -1; next[0] = -1; while(s[i] != '\0') { if(j == -1 || s[i] == s[j]) { i ++; j ++; next[i] = j; } else j = next[j]; } } void solve() { for(int i = 0; i <= len; i++) re[i] = 1; for(int i = len; i >= 1; i --) if(next[i] != -1) re[next[i]] += re[i]; int pos = len; while(pos) { cnt[num] = re[pos]; l[num ++] = pos; pos = next[pos]; } } int main() { scanf("%s", s); len = strlen(s); get_next(); solve(); printf("%d\n", num); for(int i = num - 1; i >= 0; i--) printf("%d %d\n", l[i], cnt[i]); }
相关文章推荐
- (CodeForces 432D)Prefixes and Suffixes
- Codeforces 432D Prefixes and Suffixes(KMP+dp)
- Codeforces 432D Prefixes and Suffixes(KMP+dp)
- CodeForces 432D|Prefixes and Suffixes|KMP|动态规划
- Codeforces 432D Prefixes and Suffixes(KMP+dp)
- codeforces 432D Prefixes and Suffixes (kmp+dp)
- Codeforces 432D Prefixes and Suffixes
- POJ 2572(Seek the Name, Seek the Fame) KMP中next数组的应用
- [hdu4300] next数组的应用
- POJ2185-Milking Grid(KMP,next数组的应用)
- K - Count the string kmp_Next数组应用
- nyoj 2340 最小循环节(KMP之next数组的应用)
- cf 432D Prefixes and Suffixes kmp
- Cyclic Nacklace (kmp next数组的应用)
- poj--2752Seek the Name, Seek the Fame KMPnext数组的应用
- KMP以及next数组应用--POJ1961
- POJ2752 Seek the Name, Seek the Fame KMP-next数组的应用
- hust 1010 kmp next数组的应用
- poj2752Seek the Name, Seek the Fame【kmp next数组应用】
- codeforces 126B Password (kmp,next应用)