Count the string---hdu3336(kmp Next数组的运用)
2015-09-25 20:37
369 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3336
题意就是求串s的前缀的个数和;
例如:abab
前缀 个数
a 2
ab 2
aba 1
abab 1
总数:6
dp[i] 表示前面的字符以s[i-1]结尾的前缀个数;上列中dp[4]=2(以最后一个字符b结尾的前缀) {abab,ab};
可以看出增加一个字母会产生一个新的前缀,那就是整个串,之前的前缀就是Next[i]的位置所对应的dp,即dp[Next[i]];
所以dp[i] = dp[Next[i]] + 1;-_-主要是仔细的想一下,有点绕;
View Code
题意就是求串s的前缀的个数和;
例如:abab
前缀 个数
a 2
ab 2
aba 1
abab 1
总数:6
dp[i] 表示前面的字符以s[i-1]结尾的前缀个数;上列中dp[4]=2(以最后一个字符b结尾的前缀) {abab,ab};
可以看出增加一个字母会产生一个新的前缀,那就是整个串,之前的前缀就是Next[i]的位置所对应的dp,即dp[Next[i]];
所以dp[i] = dp[Next[i]] + 1;-_-主要是仔细的想一下,有点绕;
#include<iostream> #include<stdio.h> #include<string.h> using namespace std; const int N = 2e6+7; const int mod = 10007; char s ; int dp , n, Next ; void GetNext() { int i=0,j=-1; Next[0] = -1; while(i<n) { if(j==-1 || s[i]==s[j]) Next[++i] = ++j; else j = Next[j]; } } int main() { int T, sum; scanf("%d", &T); while(T--) { scanf("%d", &n); scanf("%s", s); GetNext(); memset(dp, 0, sizeof(dp)); sum = 0; for(int i=1; i<=n; i++) { dp[i] = dp[Next[i]] + 1; sum = (sum + dp[i]) % mod; } printf("%d\n", sum); } return 0; }
View Code
相关文章推荐
- 亿丰之星 · 声动亚洲
- 在项目中使用消息队列的 10 个理由
- 软件重构
- mshta命令用法示例(在dos命令弹出消息框)
- VC关闭窗口退出
- 4、第4次课 CSS代码第三节课20150923
- OC-Block语法
- javascript中 addloadevent和insertAfter函数的使用说明
- django实现文件上传
- 【IOS 开发学习总结-OC-19】★★objective-c面向对象之——类别与扩展
- HTTP协议 (一) HTTP协议详解
- HDU 1151 Air Raid
- 【JavaScript】【学习】对象的创建和继承
- 大数 N!——java
- Healthy Holsteins(USACO 2.1.4)
- markDown学习笔记
- 黑马程序员—java技术blog—第九篇一些常见的基础语法概述
- php脚本的一些注意事项
- 找出两个点之间的所有路径(原创)
- 二维数组变一维