HDU 3336 Count the string
2010-04-16 10:53
232 查看
http://acm.hdu.edu.cn/showproblem.php?pid=3336
题目大意:这道题的意思就是给你一个字符串,从中可以分离出n个的子串,统计这n个子串在字符串出现次数的和,再把结果对10007求余。
解题思路:
例如:字符串 abcdabca
它的子串有:
a
ab
abc
abcd
abcda
abcdab
abcdabc
abcdabca
我们发现每个子串都是在之前子串的基础上增加一个字符,并且第一个字符都是a,则我们就在字符串中先搜索到a的位置,记为j,i=0,然后比较接下来的字符是否匹配,匹配则继续移动两个下标,直到不匹配。匹配的子串长度就是存在有几个的子串匹配。
题目大意:这道题的意思就是给你一个字符串,从中可以分离出n个的子串,统计这n个子串在字符串出现次数的和,再把结果对10007求余。
解题思路:
例如:字符串 abcdabca
它的子串有:
a
ab
abc
abcd
abcda
abcdab
abcdabc
abcdabca
我们发现每个子串都是在之前子串的基础上增加一个字符,并且第一个字符都是a,则我们就在字符串中先搜索到a的位置,记为j,i=0,然后比较接下来的字符是否匹配,匹配则继续移动两个下标,直到不匹配。匹配的子串长度就是存在有几个的子串匹配。
#include <stdio.h> #define size 200001 char s[size]; int next[size]; int len; int main() { int NumOfTest,i,j,count,locate; scanf("%d",&NumOfTest); while (NumOfTest--) { scanf("%d",&len); scanf("%s",s); count = len; i = 0,j = 1; while (i!=len&&j!=len) { if(s[i] == s[j]) { locate = j; /*记录匹配字串的起始位置*/ while (s[i]==s[j])/*比较匹配前k个的字串*/ { i++; j++; } count+=(j-locate>0?j-locate:1); } else j++; } printf("%d/n",count); } return 0; }
相关文章推荐
- hdu 3336 Count the string -KMP&dp
- HDU 3336 Count the string (KMP next数组运用——统计前缀出现次数)
- HDU 3336 Count the string
- hdu 3336 (Count the string) next数组+dp
- HDU 3336 Count the string(kmp)
- HDU-Count the string -3336
- HDU 3336 Count the string(kmp+dp)
- HDU 3336 Count the string
- HDU:3336-Count the string(next数组理解)
- hdu 3336 Count the string
- HDU-3336 Count the string(KMP)
- hdu 3336 Count the string(KMP+dp)
- hdu 3336 Count the string
- hdu 3336 Count the string KMP模式匹配 ★★★
- HDU 3336 Count the string(KMP)||记忆化搜索
- hdu 3336 Count the string(记忆化搜索)
- hdu 3336 Count the string
- 【HDU】3336 Count the string KMP
- [HDU 3336]Count the String[kmp][DP]
- hdu 3336 count the string