hdu3336 KMP + DP 前缀数组出现的次数
数组 出现 DP 次数 前缀 KMP
2023-09-11 14:14:00 时间
题意:
给你一个串,问你他的所有前缀子串在本串中的出现次数,注释: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 + 100 char 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; }
相关文章
- 实现函数功能对数组元素进行插入、删除、查询操作
- 数组arr中有2种数a和b出现了奇数次,其余数出现了偶数次,请你找到出现奇数次的ab,并打印他们
- 完美洗牌问题——整体交换数组的左右2部分
- ACM入门之【树状数组习题】
- [算法]数组中出现次数超过一半的数字
- 【进阶指针一】字符数组&数组指针&指针数组
- js获取数组对象再多数组中出现次数
- 《Python数据分析》一1.4 NumPy数组
- 《Python数据分析》一第2章 NumPy数组2.1 NumPy数组对象
- [LeetCode]剑指 Offer 56 - II. 数组中数字出现的次数 II
- [LeetCode]剑指 Offer 56 - I. 数组中数字出现的次数
- [计蒜客][数组]进制转换
- 剑指offer编程题解法汇总28-数组中出现次数超过一半的数字
- 力扣解法汇总2032. 至少在两个数组中出现的值
- 力扣解法汇总689-三个无重叠子数组的最大和
- 剑指 Offer 39. 数组中出现次数超过一半的数字
- js字符串中查看有没有在数组中的值有的话全部替换掉
- 《剑指offer》-- 复杂链表的复制、字符串的排列、数组中出现次数超过一半的数字、连续子数组的最大和
- 《剑指offer》-- 调整数组顺序使奇数位于偶数前面、顺时针打印矩阵、数字在排序数组中出现的次数
- 刷题笔记之二(字符串中找出连续最长的数字串+数组中出现次数超过一半的数字+另类加法+计算糖果+进制转换)
- dart - 如何制作新数组嵌套排序映射
- TestNG数组比较AssertJUnit.assertEquals
- 【c语言】统计一个数字在排序数组中出现的次数
- [LeetCode] 1287. Element Appearing More Than 25% In Sorted Array 有序数组中出现次数超过25%的元素
- 【C#】用List做动态数组