HihoCoder - 1807:好的数字串 (KMP DP)
Sample Input
- 6 1212
Sample Output
- 298
给定一个数字字符串S,如果一个数字字符串(只包含0-9,可以有前导0)中出现且只出现1次S,我们就称这个字符串是好的。
例如假设S=666,则1666、03660666是好的,6666、66、123不是好的;假设S=1212,则01212、12123是好的,121212、121是不好的。
请你计算长度为N的数字字符串中,有多少个是好的。由于总数可能很大,你只需要输出总数模1000000007的余数。
Input
一个整数N和一个数字串S。
对于30%的数据,1 ≤ N ≤ 8
对于100%的数据,1 ≤ N ≤ 1000,1 ≤ |S| ≤ N。
Output
一个整数代表答案。
思路:dp[i][j][k],表示前i位,而且当前尾巴与S的前缀的最长公共长度位j,k表示是否出现过S。 对于第i位,枚举0到9,并且用KMP找到最长公共部分。
- #include<bits/stdc++.h>
- #define rep(i,a,b) for(int i=a;i<=b;i++)
- using namespace std;
- const int maxn=;
- const int Mod=1e9+;
- int a[maxn],dp[maxn][maxn][],ans,N,L;
- int Next[maxn]; char c[maxn];
- void KMP()
- {
- for(int i=,k=;i<=L;i++){
- while(k&&a[i]!=a[k+]) k=Next[k];
- if(a[i]==a[k+]) k++; Next[i]=k;
- }
- }
- int get(int i,int j)
- {
- while(){
- if(a[i+]==j) return i+;
- if(i==) break; i=Next[i];
- }return ;
- }
- int main()
- {
- scanf("%d%s",&N,c+); L=strlen(c+); a[L+]=-;
- rep(i,,L) a[i]=c[i]-''; dp[][][]=;
- KMP();
- rep(i,,N){
- rep(j,,min(i-,L)){
- rep(k,,) {
- int t=get(j,k);
- if(j==L-){
- if(t==L) (dp[i][t][]+=dp[i-][j][])%=Mod;
- else {
- (dp[i][t][]+=dp[i-][j][])%=Mod;
- (dp[i][t][]+=dp[i-][j][])%=Mod;
- }
- }
- else {
- if(t!=L) (dp[i][t][]+=dp[i-][j][])%=Mod;
- (dp[i][t][]+=dp[i-][j][])%=Mod;
- }
- }
- }
- }
- rep(i,,L) (ans+=dp[N][i][])%=Mod;
- printf("%d\n",ans);
- return ;
- }
HihoCoder - 1807:好的数字串 (KMP DP)的更多相关文章
- 【XSY2779】最小表示串 KMP DP polya定理
题目描述 给你一个字符串\(s\),问你有多少个串是最小表示串且字典序\(\leq s\) \(|s|\leq 1000\) 题解 先把\(s\)变成比\(s\)小的最大的最小表示串.方法是从后枚举每 ...
- hihocoder #1301 : 筑地市场 二分+数位dp
#1301 : 筑地市场 题目连接: http://hihocoder.com/problemset/problem/1301 Description 筑地市场是位于日本东京都中央区筑地的公营批发市场 ...
- 【模拟】Vijos P1005 超长数字串
题目链接: https://vijos.org/p/1005 题目大意: 无限的正整数按顺序拼接成字符串S(S=12345678910111213...),给你一个字符串A(len<=200)求 ...
- 洛谷P3193 [HNOI2008]GT考试 kmp+dp
正解:kmp+dp+矩阵优化 解题报告: 传送门! 啊刚说想做矩阵优化dp的字符串题就找到辣QwQ虽然不是AC自动机的但都差不多嘛QwQ 首先显然可以想到一个dp式?就f[i][j]:凑出i位了,在s ...
- BZOJ4037:[HAOI2015]数字串拆分——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4037 你有一个长度为n的数字串.定义f(S)为将S拆分成若干个1~m的数的和的方案数,比如m=2时 ...
- bzoj4037 [HAOI2015]数字串拆分
Description 你有一个长度为n的数字串.定义f(S)为将S拆分成若干个1~m的数的和的方案数,比如m=2时,f(4)=5,分别为4=1+1+1+1你可以将这个数字串分割成若干个数字(允许前导 ...
- ZZNU-oj-2141:2333--【O(N)求一个数字串能整除3的连续子串的个数,前缀和数组+对3取余组合数找规律】
2141: 2333 题目描述 “别人总说我瓜,其实我一点也不瓜,大多数时候我都机智的一批“ 宝儿姐考察你一道很简单的题目.给你一个数字串,你能判断有多少个连续子串能整除3吗? 输入 多实例输入,以E ...
- [BZOJ1009] [HNOI2008] GT考试(KMP+dp+矩阵快速幂)
[BZOJ1009] [HNOI2008] GT考试(KMP+dp+矩阵快速幂) 题面 阿申准备报名参加GT考试,准考证号为N位数X1X2-.Xn,他不希望准考证号上出现不吉利的数字.他的不吉利数学A ...
- HDU 6153 A Secret ( KMP&&DP || 拓展KMP )
题意 : 给出两个字符串,现在需要求一个和sum,考虑第二个字符串的所有后缀,每个后缀对于这个sum的贡献是这个后缀在第一个字符串出现的次数*后缀的长度,最后输出的答案应当是 sum % 1e9+7 ...
随机推荐
- Qt绘制字体并获取文本宽度
参考资料: https://blog.csdn.net/liang19890820/article/details/51227894 QString text("abc");QPa ...
- summer_19th,Nov 2018
一.内存管理: Cpython解释器的垃圾回收机制 一个没有绑定任何变量名的值被称为垃圾,即该值的引用计数为零. 二.变量值的三个特点: id: 内存地址 type: 数据类型 值 总结:id相同,值 ...
- Struts 2 初步入门(六)之处理结果类型
Struts2 处理流程: 用户请求--->struts框架--->Action控制器--->struts框架--->视图资源 xml配置文件里: <result nam ...
- WordDenified.exportedUI
<mso:cmd app="Word" dt="1" /><mso:customUI xmlns:x1="xuzaAzWord&qu ...
- Java Web(八) 事务,安全问题及隔离级别
事务 什么是事务? 事务就是一组原子性的SQL查询,或者说是一个独立的工作单元. 事务的作用 事务在我们平常的CRUD(增删改查)操作当中也许不太常用, 但是如果我们有一种需求,一组操作中必须全部成功 ...
- Java的Properties类使用
一.Java Properties类 Java中有个比较重要的类Properties(Java.util.Properties),主要用于读取Java的配置文件,各种语言都有自己所支持的配置文件,配置 ...
- MATLAB 图片折腾4
重新安排矩阵的x,y,z , 在二维中就相当于把x,y 对换,在三维中相当于可以把三个坐标的位置互换. 比如A = A(:,:,1)=repmat(1,3,3);A(:,:,2)=repmat(2,3 ...
- Spring、SpringMVC、Hibernate详细整合实例,包含所有步骤
Eclipse完整工程如下 Jar包如下 CSDN下载地址:https://download.csdn.net/download/zhutouaizhuwxd/9721062 其中,整个工程主要可以分 ...
- SQL-33 创建一个actor表,包含如下列信息
题目描述 创建一个actor表,包含如下列信息 列表 类型 是否为NULL 含义 actor_id smallint(5) not null 主键id first_name varchar(45) ...
- tomcat启动失败,提示信息:Unable to ping server at localhost:1099
jdk1.7+maven9.0.0开启服务器时,提示Unable to ping server at localhost:1099 然后换成tomcat8.5.1就成功开启服务器