Codeforces Round #246 (Div. 2)-D. Prefixes and Suffixes(KMP+DP)
2016-10-20 23:09
375 查看
原题链接
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 li ci.
Numbers li ci mean
that the prefix of the length li matches
the suffix of length li and
occurs in string s as a substringci times.
Print pairs li ci in
the order of increasing li.
Examples
input
output
input
output
某大牛思路:
题目分析 :首先得到母串的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,因为长的可能会包含短的,我们可以递归得到dp数组(dp记录的就是子串出现的次数)re数组的递归式为dp[next[i]] += dp[i];
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 li ci.
Numbers li ci mean
that the prefix of the length li matches
the suffix of length li and
occurs in string s as a substringci times.
Print pairs li ci in
the order of increasing li.
Examples
input
ABACABA
output
3 1 4 3 2 7 1
input
AAA
output
3 1 3 2 2 3 1
某大牛思路:
题目分析 :首先得到母串的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,因为长的可能会包含短的,我们可以递归得到dp数组(dp记录的就是子串出现的次数)re数组的递归式为dp[next[i]] += dp[i];
#include <bits/stdc++.h> #define maxn 100005 #define MOD 1000000007 using namespace std; typedef long long ll; char str[maxn]; int next[maxn], dp[maxn]; int ans1[maxn], ans2[maxn], cnt; void KMP(){ next[0] = -1; int i = 0, j = -1; while(str[i]){ if(j == -1 || str[i] == str[j]){ i++; j++; next[i] = j; } else j = next[j]; } } void solve(){ int len = strlen(str); for(int i = 0; i <= len; i++){ dp[i] = 1; } for(int i = len; i >= 1; i--){ if(next[i] != -1){ dp[next[i]] += dp[i]; } } int pos = len; while(pos){ ans1[cnt] = pos; ans2[cnt++] = dp[pos]; pos = next[pos]; } } int main(){ // freopen("in.txt", "r", stdin); scanf("%s", str); KMP(); solve(); printf("%d\n", cnt); while(cnt--){ printf("%d %d\n", ans1[cnt], ans2[cnt]); } return 0; }
相关文章推荐
- Codeforces 432D Prefixes and Suffixes(KMP+dp)
- Codeforces 432D Prefixes and Suffixes(KMP+dp)
- codeforces 432D Prefixes and Suffixes (kmp+dp)
- Codeforces 432D Prefixes and Suffixes(KMP+dp)
- CodeForces 432D|Prefixes and Suffixes|KMP|动态规划
- CF 246 div2 D Prefixes and Suffixes (全部前缀的出现次数)
- codeforces Round 246 D. Prefixes and Suffixes (后缀数组 || KMP)
- cf 432D Prefixes and Suffixes kmp
- Codeforces Round #246 (Div. 2) D. Prefixes and Suffixes(后缀数组orKMP)
- cf 432D Prefixes and Suffixes kmp
- cf 432D Prefixes and Suffixes kmp
- CF 246 div2 D Prefixes and Suffixes (所有前缀的出现次数)
- codeforce Round201 div1 B. Lucky Common Subsequence KMP+DP
- Codeforces Round #246 (Div. 2) D. Prefixes and Suffixes
- Codeforces Round #282 (Div. 1)B. Obsessive String KMP+DP
- codeforces Round 246 D. Prefixes and Suffixes (后缀数组 || KMP)
- Codeforces Round #246 (Div. 2) D. Prefixes and Suffixes
- CF#369(Div2) C. Coloring Trees (DP)
- Codeforces Round #261 (Div. 2)(树状数组,dp,dfs构造序列)
- Codeforces Round #430 (Div. 2) C. Ilya And The Tree 树dp 统计