hdu3336 KMP + DP 前缀数组出现的次数
来源:互联网 发布:天天炫舞开挂软件下载 编辑:程序博客网 时间:2024/06/03 21:37
题意:
给你一个串,问你他的所有前缀子串在本串中的出现次数,注释:abc的前缀子串是
a ab abc;
思路:
还是利用了next数组,先对子串求出next数组,再开一个数组dp,初始化全是1,因为每个以当前i结尾的都至少是1,然后从后往前更新,把以i结尾的加到以next[i]结尾的上,
运用的next数组的特点相当于 123123123 最后一个3加到倒数第二个3,倒数第二个3再加到第一个3 那么以3结尾的(123)出现了三次,以3结尾的(123123)出现了两次,以3结尾的(123123123) 出现了一次。
例子详细数据:
原串 123123123
next 000123456
dp 333222111
提示:
给你一个串,问你他的所有前缀子串在本串中的出现次数,注释:abc的前缀子串是
a ab abc;
思路:
还是利用了next数组,先对子串求出next数组,再开一个数组dp,初始化全是1,因为每个以当前i结尾的都至少是1,然后从后往前更新,把以i结尾的加到以next[i]结尾的上,
运用的next数组的特点相当于 123123123 最后一个3加到倒数第二个3,倒数第二个3再加到第一个3 那么以3结尾的(123)出现了三次,以3结尾的(123123)出现了两次,以3结尾的(123123123) 出现了一次。
例子详细数据:
原串 123123123
next 000123456
dp 333222111
提示:
这个题目的串之间是可以交叉的,但不可以完全重叠,比如对与这个题目11111的答案是15.
#include<stdio.h>#include<string.h>#define N 200000 + 100char str[N];int next[N];int dp[N];void get_next(int m){ int j ,k; j = 0 ,k = -1; next[0] = -1; while(j < m) { if(k == -1 || str[j] == str[k]) next[++j] = ++k; else k = next[k]; } return ;}int main (){ int t ,m ,i; scanf("%d" ,&t); while(t--) { scanf("%d" ,&m); scanf("%s" ,str); get_next(m); for(i = 1 ;i <= m ;i ++) dp[i] = 1; int sum = 0; for(i = m ;i >= 1 ;i --) { if(next[i]) { dp[next[i]] += dp[i]; dp[next[i]] %= 10007; } sum += dp[i]; sum %= 10007; } /* for(i = 1 ;i <= m ;i ++) printf("%d " ,next[i]); printf("\n"); for(i = 1 ;i <= m ;i ++) printf("%d " ,dp[i]); printf("\n"); */ printf("%d\n" ,sum); } return 0;}
0 0
- hdu3336 KMP + DP 前缀数组出现的次数
- HDU3336前缀次数和
- Hdu 4552 怪盗基德的挑战书 (所有前缀出现次数和 后缀数组或KMP)
- HDU3336------KMP+DP
- hdu3336(KMP+DP)
- hdu3336(KMP+DP)
- hdu3336(kmp+dp)
- hdu3336解读KMP算法的next数组
- Hdu 3336 Count the string (KMP+DP 前缀出现次数和)
- 【hdu3336】——KMP&&dp
- hdoj 4552 怪盗基德的挑战书 【KMP 求所有前缀在原串种出现的次数之和】
- HDU 3336 KMP 求所有前缀在母串中出现的次数
- hdoj 3336 Count the string 【kmp求 所有前缀 在原串中出现的次数 总和】
- 所有前缀在串中出现的次数之和 kmp hdu 3336 count the string
- hdu 3336Count the string(KMP变形,求前缀出现的次数和)
- 【Kmp求字符串前缀在字符串出现的次数】51nod 1277 字符串中的最大值
- KMP算法 —— next 数组的应用 --- 前缀中最小循环节,最大重复次数
- KMP算法 —— next 数组的应用 --- 前缀中最小循环节,最大重复次数
- c++ 希尔排序
- Android 设计模式
- QT4.8.4 +VS2010 一些个人遇到的错误
- c++ 直接插入排序
- 一道面试题看 HashMap 的存储方式
- hdu3336 KMP + DP 前缀数组出现的次数
- 在MATLAB中实现字符串矩阵
- SPOJ GSS5 Can you answer these queries V (线段树)
- 使用不同版本Gradle构建Andorid 出现Gradle version xxxx is required
- 从 github 上 download 项目后
- Gradle构建Android Project出现java.io.File找不到的问题
- 【MongoDB】3、分布式MongoDB
- Intellij无法同步Gradle, 出现org.gradle.plugins.ide.internal.IdeDependenciesExtractor错误
- c++ 桶排序算法