HDU 3336 Count the string(KMP+求给定字符串含前缀的数量)
2017-04-18 15:33
281 查看
Count the string
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 9931 Accepted Submission(s): 4643
Problem Description
It is well known that AekdyCoin is good at string problems as well as number theory problems. When given a string s, we can write down all the non-empty prefixes of this string. For example:
s: "abab"
The prefixes are: "a", "ab", "aba", "abab"
For each prefix, we can count the times it matches in s. So we can see that prefix "a" matches twice, "ab" matches twice too, "aba" matches once, and "abab" matches once. Now you are asked to calculate the sum of the match times for all the prefixes. For "abab",
it is 2 + 2 + 1 + 1 = 6.
The answer may be very large, so output the answer mod 10007.
Input
The first line is a single integer T, indicating the number of test cases.
For each case, the first line is an integer n (1 <= n <= 200000), which is the length of string s. A line follows giving the string s. The characters in the strings are all lower-case letters.
Output
For each case, output only one number: the sum of the match times for all the prefixes of s mod 10007.
Sample Input
1 4 abab
Sample Output
6
Author
foreverlin@HNU
Source
HDOJ Monthly Contest – 2010.03.06
Recommend
lcy | We have carefully selected several similar problems for you: 1686 1358 3341 2222 3068
#include<stdio.h> #include<string.h> int n,m; char b[200010]; int p[200010]; //生成匹配表 void get_p() { p[1] = 0; int i,j = 0; for(i = 2; i <= m; i++) { while(j > 0 && b[j+1] != b[i]) { j = p[j]; } if(b[j+1] == b[i]) { j += 1; } p[i] = j; } } int dp[2000010]; int main() { int t,i; scanf("%d",&t); while(t--) { scanf("%d",&m); scanf("%s",b+1); get_p(); dp[0] = 0; int sum = 0; for(i = 1; i <= m; i++) { dp[i] = dp[p[i]] + 1; //含前缀的数量 sum = (sum+dp[i])%10007; //注意输出格式 } printf("%d\n",sum); } } //示例解析: a b a b 0 0 1 1 m+1+1=6 注意循环的使用
相关文章推荐
- Hdu 3336 Count the string(求给定字符串含前缀的数量)
- hdu4552怪盗基德的挑战书 --KMP求字符串所有的前缀数
- HDU1251(统计难题)统计以某个字符串为前缀的单词数量(Trie树)
- [codewars]1.返回给定字符串中的元音的数量(计数)。(a,e,i,o,u为元音)
- C++:求解给定字符串的前缀
- 【Kmp求字符串前缀在字符串出现的次数】51nod 1277 字符串中的最大值
- PTA 求解给定字符串的前缀
- 字符串相关处理kmp,前缀数,后缀树,后缀数组,最长回文串,最长重复字串,最长非重复字串
- trie学习 --HDU1251 输入字符串,统计以这个字符串为前缀的单词数量
- 用Trie树统计以给定字符串为前缀的单词个数
- 字符串相关处理kmp,前缀数,后缀树,后缀数组,最长回文串,最长重复字串,最长非重复字串
- Zoj 3587 Marlon's String (KMP 字符串拼接 前缀出现次数)
- HDU 1251 统计难题(统计以某个字符串为前缀的字符串数量)
- 最大堆---实现一个简化的搜索提示系统。给定一个包含了用户query的日志文件,对于输入的任意一个字符串s,输出以s为前缀的在日志中出现频率最高的前10条query。
- KMP-删除字符串中给定的字符串
- 字符串相关处理kmp,前缀数,后缀树,后缀数组,最长回文串,最长重复字串,最长非重复字串
- Shortest Prefixes 【字典树 求给定字符串的 最短确定前缀】
- hdu 1358 Period(给定一个字符串,求有多少个前缀(包括自己本身),它是由k(k>2,并且尽量大)个循环节组成的)
- HUST 1328 String (字符串前缀子串个数 --- KMP)
- HUST 1328 String (字符串前缀子串个数 --- KMP)