HDOJ 3336 Count the string KMP
来源:互联网 发布:2016年的网络流行语 编辑:程序博客网 时间:2024/06/05 17:34
Count the string
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4842 Accepted Submission(s): 2293
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.
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.
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
14abab
Sample Output
6
/*题目要求求:字串的前缀个数+与前缀相同的子串个数 字串的前缀个数当然就是整个串的长度了,与前缀相同的子串个数 就是KMP求得的fun函数(部分匹配函数) fun[i]表示前缀等于后缀的最大长度,说明有 24abab12abcabacbabca*/#include<iostream>#include<stdio.h>using namespace std;char target[10001],str[1000001];void cal(char s[],int fun[]){int len,LOLP,i,L;len=strlen(s);L=0;//最长前缀fun[1]=0;for(i=2;i<=len;i++){while(L>0 && (s[L]!=s[i-1]))L=fun[L];if(s[L]==s[i-1])L++;fun[i]=L;} }int main(){int i,t,sum,n,fun[200001];//freopen("test.txt","r",stdin);scanf("%d",&t);while(t--){scanf("%d",&n);scanf("%s",target);cal(target,fun);sum=0;for(i=1;i<=n;i++){if(fun[i]!=0) sum++;if(sum>10007)sum=sum%10007;}sum+=n;sum=sum%10007;printf("%d\n",sum);}return 0;}
0 0
- 【KMP】 HDOJ 3336 Count the string
- HDOJ 3336 Count the string KMP
- HDOJ Count the string 3336【KMP】
- hdoj 3336 Count the string 【KMP】
- HDOJ 题目3336Count the string(kmp)
- hdoj 3336 Count the string
- HDOJ 3336 Count the string
- HDOJ 3336 Count the string
- HDOJ 3336 Count the string
- Count the string + KMP
- Count the string (KMP)
- hdoj 3336 Count the string 【kmp求 所有前缀 在原串中出现的次数 总和】
- hdu 3336 Count the string KMP
- KMP Hdu-3336 Count the string
- HDU 3336 Count the string(KMP 理解)
- HDU 3336 Count the string KMP
- HDU 3336 Count the string(KMP+dp)
- [HDU 3336]Count the String[kmp]
- [2406]Power Strings (POJ) KMP
- drgon的消息处理
- 二叉树结点的最大距离
- Autodesk Vault具体功能的详细介绍
- Activity的onStart()和onResume()的区别
- HDOJ 3336 Count the string KMP
- How to SSH to a VirtualBox guest externally through a host?
- POJ 1201 Intervals (差分约束系统, 贪心+线段树)
- 2013~2014年终总结
- python中各种基础类型的转换,二进制,八进制,十进制,十六进制
- LeetCode OJ - Symmetric Tree
- java string类 基本操作
- CoAP学习笔记——nodeJS node-coap返回JSON数据包
- 【1004】Financial Management (POJ)(水题——求平均值)