BZOJ_1009_[HNOI2008]_GT考试_(动态规划+kmp+矩阵乘法优化+快速幂)

描述


http://www.lydsy.com/JudgeOnline/problem.php?id=1009

字符串全部由0~9组成,给出一个串s,求一个长度为n的串,不包含s的种类有多少.

 

分析


第一眼以为是组合.然后更滑稽的是用错误的方法手算样例居然算出来是对的...我数学是有多差...

题解也是看了好半天,有点难理解.

感觉PoPoQQQ神犇讲得还是比较清楚的.传送门:http://blog.csdn.net/popoqqq/article/details/40188173

我们用dp[i][j]表示 : 长度为i的串, 其长度为j的后缀 与 s长度为j的前缀 完全匹配的种类数.

这样的话最后的答案就是ans=sigma{dp[n][i]}(0<=i<m).

这里还有一个二维的a数组,就这个比较难解释...

dp[i][y]可以由dp[i-1][x]转移而来,那么匹配的s的前缀由长度x变成了长度y,a[x][y]表示的就是在结尾添加一个字符后,匹配长度从x变成y,这样的字符有多少种.

那么 dp[i][y]=sigma{dp[i-1][x]*a[x][y]}.

这个可以用矩阵乘法算.

那么a数组怎么求呢?用kmp.

a[x][y]表示的是前缀匹配长度由x变成了y的种类数,那么从每一位i开始匹配,如果匹配到了j,那么a[i][j+1]++(数组从0开始,第i位之前匹配了i个,匹配到第j位,应该是j+1个).

 

p.s.我好菜呀...

 

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 const int maxn=100+5;
 5 int n,m,p,ans;
 6 char str[maxn];
 7 int f[maxn];
 8 
 9 struct matrix{
10     int x[25][25];
11     matrix(){ memset(x,0,sizeof x); }
12     int * operator [] (int id){ return x[id]; }
13 }dp,a;
14 void operator *= (matrix &x,matrix &y){
15     matrix z;
16     for(int i=0;i<m;i++)for(int j=0;j<m;j++)for(int k=0;k<m;k++)
17         z[i][j]+=x[i][k]*y[k][j], z[i][j]%=p;
18     x=z;
19 }
20 void kmp(){
21     for(int i=1;i<m;i++){
22         int j=f[i];
23         while(j&&str[i]!=str[j]) j=f[j];
24         f[i+1]=str[i]==str[j]?j+1:0;
25     }
26     for(int i=0;i<m;i++)for(char k='0';k<='9';k++){
27         int j=i;
28         while(j&&k!=str[j]) j=f[j];
29         if(k==str[j]) a[i][j+1]++;
30         else a[i][0]++;
31     }
32 }
33 void quick_power(int y){
34     for(;y;a*=a,y>>=1) if(y&1) dp*=a;
35 }
36 int main(){
37     scanf("%d%d%d",&n,&m,&p);
38     scanf("%s",str);
39     kmp();
40     dp[0][0]=1;
41     quick_power(n);
42     for(int i=0;i<m;i++) ans+=dp[0][i], ans%=p;
43     printf("%d\n",ans);
44     return 0;
45 }
View Code

 

1009: [HNOI2008]GT考试

Time Limit: 1 Sec  Memory Limit: 162 MB
Submit: 2815  Solved: 1738
[Submit][Status][Discuss]

Description

  阿申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字。
他的不吉利数学A1A2...Am(0<=Ai<=9)有M位,不出现是指X1X2...Xn中没有恰好一段等于A1A2...Am. A1和X1可以为
0

Input

  第一行输入N,M,K.接下来一行输入M位的数。 N<=10^9,M<=20,K<=1000

Output

  阿申想知道不出现不吉利数字的号码有多少种,输出模K取余的结果.

Sample Input

4 3 100
111

Sample Output

81

HINT

Source

转载于:https://www.cnblogs.com/Sunnie69/p/5554726.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/271687.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智慧政务解决方案(28页)pdf_【金众电子】智慧政务解决方案

智慧政务解决方案立式党建广告机广告机简介&#xff1a;KC-立式政务广告机(室内/室外可选)液晶屏幕特别卖点&#xff1a;安装简易、亮度调节、实时更新、传输安全应用场所&#xff1a;各种需要文化传播的政务机构、政府机关、会议场所等。双立柱政务文化栏/宣传栏文化栏简介&am…

笨办法学linux dhcp,了解网关、DNS、子网掩码、MAC地址、DHCP

原标题&#xff1a;了解网关、DNS、子网掩码、MAC地址、DHCP什么是网关、DNS、子网掩码&#xff0c;它有什么作用&#xff0c;确实&#xff0c;我们平时在网络中总是在不断的提到网关&#xff0c;却很少真正的去了解它。一、什么是网关1、什么是网关网关是一种充当转换重任的计…

数据库:SQLServer Stuff 函数用法笔记

今天小编给大家分享一下自己整理一下SQLServer Stuff函数用法技巧和常用示例&#xff0c;有需要的朋友可以学习一下。一、Stuff函数的作用1.1官方解释STUFF 函数将字符串插入到另一个字符串中。 它从第一个字符串的开始位置删除指定长度的字符&#xff1b;然后将第二个字符串插…

自定义注解,aop实现注解锁

多线程环境下&#xff0c;会出现线程不安全的问题&#xff0c;所以要对某些方法加锁以保证线程安全 但是如果方法过多&#xff0c;每个方法前后都加这么一句&#xff0c;有点麻烦了&#xff0c;而且代码可读性也会差一些。可以使用aop切面编程&#xff0c;对某些加有特定注解&…

手机端刷recovery工具_MIUI/REDMIN手机玩机汇集

愿你刷机半生归来仍是MIUI1解锁篇解锁Bootloader准备工作&#xff1a;1.手机备份数据2.手机进入开发者模式①进入“设置 -> 我的设备 -> 全部参数"中连续点击MIUI版本&#xff0c;进入”开发者模式“②进入“设置 -> 开发者选项 -> 设备解锁状态”中绑定账号和…

数据结构基础:线性表学习笔记

1、线性表定义线性表是指n个元素的有限序列(n>0),通常用(a1,a2,a3...,an),来表示。2、线性表特点1、存在唯一的一个首元素2、存在唯一一个尾元素3、除第首元素外&#xff0c;每个元素只有一个直接前驱。4、除尾元素外&#xff0c;每个元素只有一个直接后继。3、线性表的存储…

iphone导出照片到电脑_iPhone里的照片如何快速导入电脑

前几日我一好友发微信问我&#xff1a;“向阳&#xff0c;我手机里有一万多张照片&#xff0c;怎么能快速的备份到电脑里&#xff1f;”我一看这问题&#xff0c;确实很多果友从用苹果手机开始&#xff0c;机器已经更新换代了好多代了&#xff0c;照片是越来越多&#xff0c;内…

数据结构基础:栈和队列学习笔记

1、栈1.1 栈的定义栈是只能通过访问它的一端来实现数据的存储和检索的一种特殊的线性数据结构。栈的修改要遵循先进后出的原则&#xff0c;这个是栈的核心。在栈中进行插入和删除操作的一端称为栈顶&#xff08;Top&#xff09;。另一端被称为栈底&#xff08;bottom&#xff0…

idea @Autowired 注入爆红(无法注入)

问题如下图所示,idea Autowired 注入爆红(无法注入) seettings ----> Editor Inspactions ----->spring ---->spring Core ----> Code ----> Autowring for Bean Class 去掉那个勾 效果如下

华为手机相册怎么镜像翻转_怎么利用手机相册制作电子视频

怎么通过手机照片制作视频&#xff1f;将照片做成视频并不是很难&#xff0c;可以直接在手机上进行操作&#xff0c;下面来看看是怎么操作的。方法/步骤在手机上打开清爽视频编辑器&#xff0c;有视频编辑、美拍美摄、电子相册、特效模板、动感视频、创意视频、动态字幕、视频变…

数据结构基础:树结构的学习笔记

1、树的定义树是n(n>0)个节点的有限集合。当n0时称为空树&#xff0c;当n>0 为非空树&#xff0c;任何非空树中&#xff0c;有且仅有一个根节点&#xff1b;其余节点可分为m(m>0)个互不相交的有限集合T1、T2 等&#xff0c;其中每一个集合都可以称为一棵树&#xff0c…

android组件用法说明,Android第三方控件PhotoView使用方法详解

Android第三方控件PhotoView使用方法详解发布时间&#xff1a;2020-10-21 15:06:09来源&#xff1a;脚本之家阅读&#xff1a;74作者&#xff1a;zhaihaohao1PhotoView的简介&#xff1a;这是一个图片查看库&#xff0c;实现图片浏览功能&#xff0c;支持pinch(捏合)手势或者点…

idea中新建分支并且切换到新建的分支上

开发新功能,idea上新建自己的分支,要在dev分支上新建 首先,idea右下角可以看到目前在dev分支上 点击dev,接着New Branch 输入分支名 在Local Branches中就显示了 然后可以看到已经切换到刚新建的分支上了 想要切换到刚新建的分支上开发时,可以点击分支,在弹框上点击Checkout

vnpy怎么创建策略并回测_【手把手教你】入门量化回测最强神器backtrader(一)

1 引言目前基于Python的量化回测框架有很多&#xff0c;开源框架有zipline、vnpy、pyalgotrader和backtrader等&#xff0c;而量化平台有Quantopian&#xff08;国外&#xff09;、聚宽、万矿、优矿、米筐、掘金等&#xff0c;这些量化框架或平台各有优劣。就个人而言&#xff…

数据结构基础:算法的基础知识笔记

1、算法的概念算法是问题求解过程中的精确描述&#xff0c;它为解决某一特定类型的问题规定了一个运算过程。2、算法的特点2.1 有穷性一个算法必须在有穷的步骤结束后结束&#xff0c;并且每一步都在有穷时间内完成。2.2 确定性算法的执行过程中每一步都要有确定的定义&#xf…

数据结构基础:图结构的学习笔记

1、图的定义图是比树更加复杂的数据结构&#xff0c;在图的结构当中&#xff0c;任意两个节点之间都有可能有直接关系&#xff0c;所以图中一个节点的前驱和后继的数目是没有限制的。2、图的用途用于描述各种复杂的数据对象&#xff0c;在自然科学、社会科学和人文科学等很多领…

企业网站 源码 服务邮箱:_企业网站建设对于服务器的选择至关重要

网站建设是离不开租用服务器的&#xff0c;这是目前大多数企业都在做的。但有些企业由于对网站服务器的租用技巧及经验的缺乏&#xff0c;经常会导致网站在运营过程中出现非常多的问题&#xff0c;严重影响了企业业务的正常开展。石家庄网站建设方面的人才来说明几点不容忽视的…

linux sli 提高效率,从原理到性能提升 MCP78智能SLI全解析

NVIDIA正式发布了“Hbrid SLI”技术在昨日的2008 CES上&#xff0c;NVIDIA正式向外界发布了“Hbrid SLI”技术&#xff0c;即我们所俗称的混合SLI&#xff0c;而NVIDIA在发布时已更正式名为“智能SLI技术”。虽然这仅仅是NVIDIA在此次消费电子展上的宣讲主题之一&#xff0c;但…

[GitHub]第三讲:简单分支操作

Git 最核心的操作对象是版本&#xff08; commit &#xff09;&#xff0c;最核心的操作技巧就是分支。 什么是分支&#xff1f; 仓库创建后&#xff0c;一旦有了新 commit&#xff0c;默认就会放到一个分支上&#xff0c;名字叫 master。前面咱们一直看到的多个版本组成的一条…