【bzoj1009】: [HNOI2008]GT考试

先用kmp写个暴力

 /* http://www.cnblogs.com/karl07/ */
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
char s[];
int n,m,p,fail[],f[][]; void kmp(){
fail[]=;
for (int i=;i<=m;i++){
fail[i]=fail[i-];
if (s[fail[i-]]==s[i-]) fail[i-]=fail[fail[i-]];
while (s[fail[i]]!=s[i-] && fail[i]) fail[i]=fail[fail[i]];
fail[i]++;
}
} int main(){
scanf("%d%d%d",&n,&m,&p);
scanf("%s",s+);
kmp();
f[][]=;
for (int i=;i<=n;i++){
for (int j=;j<m;j++){
for (int k='',now=j+;k<='';k++,now=j+){
while (k!=s[now] && now) now=fail[now];
f[i][now]=(f[i][now]+f[i-][j])%p;
}
}
}
int ans=;
for (int i=;i<m;i++){
ans=(ans+f[n][i])%p;
}
printf("%d\n",ans);
return ;
}

暴力

然后对着转移方程yy一下矩阵就好辣

 /* http://www.cnblogs.com/karl07/ */
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
char s[];
int n,m,p,fail[];
struct MAT{
int m[][];
int x,y;
}m1,m2; MAT operator * (const MAT &a,const MAT &b){
MAT c;
c.x=b.x,c.y=a.y;
for (int i=;i<=c.x;i++){
for (int j=;j<=c.y;j++){
c.m[i][j]=;
for (int k=;k<=b.y;k++){
c.m[i][j]=(c.m[i][j]+a.m[k][j]*b.m[i][k])%p;
}
}
}
return c;
} int sum(MAT a){
int ans=;
for (int i=;i<=a.x;i++){
for (int j=;j<=a.y;j++){
ans=(ans+a.m[i][j])%p;
}
}
return ans;
} void kmp(){
fail[]=;
for (int i=;i<=m;i++){
fail[i]=fail[i-];
if (s[fail[i-]]==s[i-]) fail[i-]=fail[fail[i-]];
while (s[fail[i]]!=s[i-] && fail[i]) fail[i]=fail[fail[i]];
fail[i]++;
}
} MAT qpow(int x){
for (;x;x=(x>>),m2=m2*m2) if (x&) m1=m1*m2;
return m1;
} int main(){
scanf("%d%d%d",&n,&m,&p);
scanf("%s",s+);
kmp();
m1.x=m;m1.y=;m1.m[][]=;
m2.x=m2.y=m;
for (int i=;i<=m;i++) m1.m[i][]=;
for (int i=;i<=m;i++) for (int j=;j<=m;j++) m2.m[i][j]=;
for (int j=;j<m;j++){
for (int k='',now=j+;k<='';k++,now=j+){
while (k!=s[now] && now)now=fail[now];
m2.m[now+][j+]++;
}
}
printf("%d\n",sum(qpow(n)));
return ;
}

正解

为什么感觉自己的kmp写的好奇怪。。

【bzoj1009】: [HNOI2008]GT考试 字符串-kmp-矩阵乘法-DP的更多相关文章

  1. bzoj1009: [HNOI2008]GT考试(kmp+矩阵乘法)

    1009: [HNOI2008]GT考试 题目:传送门 题解: 看这第一眼是不是瞬间想起组合数学??? 没错...这样想你就GG了! 其实这是一道稍有隐藏的矩阵乘法,好题! 首先我们可以简化一下题意: ...

  2. HNOI2008 GT考试 (KMP + 矩阵乘法)

    传送门 这道题目的题意描述,通俗一点说就是这样:有一个长度为n的数字串(其中每一位都可以是0到9之间任意一个数字),给定一个长度为m的模式串,求有多少种情况,使得此模式串不为数字串的任意一个子串.结果 ...

  3. P3193 [HNOI2008]GT考试(KMP+矩阵乘法加速dp)

    P3193 [HNOI2008]GT考试 思路: 设\(dp(i,j)\)为\(N\)位数从高到低第\(i\)位时,不吉利数字在第\(j\)位时的情况总数,那么转移方程就为: \[dp(i,j)=dp ...

  4. 2018.10.22 bzoj1009: [HNOI2008]GT考试(kmp+矩阵快速幂优化dp)

    传送门 f[i][j]f[i][j]f[i][j]表示从状态"匹配了前i位"转移到"匹配了前j位"的方案数. 这个东西单次是可以通过跳kmp的fail数组得到的 ...

  5. 【BZOJ1009】[HNOI2008]GT考试 next数组+矩阵乘法

    [BZOJ1009][HNOI2008]GT考试 Description 阿申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的 ...

  6. [Bzoj1009][HNOI2008]GT考试(KMP)(矩乘优化DP)

    1009: [HNOI2008]GT考试 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 4309  Solved: 2640[Submit][Statu ...

  7. bzoj1009: [HNOI2008]GT考试 ac自动机+矩阵快速幂

    https://www.lydsy.com/JudgeOnline/problem.php?id=1009 阿申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9 ...

  8. BZOJ1009:[HNOI2008]GT考试(AC自动机,矩乘DP)

    Description 阿申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字. 他的不吉利数学A1A2...Am(0< ...

  9. [BZOJ1009] [HNOI2008] GT考试(KMP+dp+矩阵快速幂)

    [BZOJ1009] [HNOI2008] GT考试(KMP+dp+矩阵快速幂) 题面 阿申准备报名参加GT考试,准考证号为N位数X1X2-.Xn,他不希望准考证号上出现不吉利的数字.他的不吉利数学A ...

随机推荐

  1. mysql表的增删改查

    一.表介绍 表相当于文件,表中的一条记录就相当于文件的一行内容,不同的是,表中的一条记录有对应的标题,称为表的字段 id,name,qq,age称为字段,其余的,一行内容称为一条记录 二.创建表 cr ...

  2. 【phonegap】下载文件

    <!-- 打包的时候phonegap自己会添加这个文件--> <script type="text/javascript" charset="utf-8 ...

  3. VirtualBox 桥接

    1.设置Virtual box,取消DHCP服务 管理->全局设定->网络->Host-Only->网络明细->DHCP服务器->启用服务器选项取消 2.宿机设置 ...

  4. PHP PDO SQLSERVER

    $bbs = new PDO("odbc:MSSQLServer",   $username_bbs,    $password_bbs $bbs = new PDO('); $s ...

  5. zookpeer的安装与配置

    zookpeer集群搭建: 集群搭建过程简介: 这里准3台服务器做zk(zookpeer下面简称zk)集群搭建: zk集群由一个leader和两个follower组成,对外端口默认为2181端口,关于 ...

  6. Unity shader saturate

    当你想将颜色值规范到0~1之间时,你可能会想到使用saturate函数(saturate(x)的作用是如果x取值小于0,则返回值为0.如果x取值大于1,则返回值为1.若x在0到1之间,则直接返回x的值 ...

  7. ubunt 14.04 Could not find CMAKE_ROOT !!! CMake has most likely not been installed correctly. Modul

    CMake Error: Could not find CMAKE_ROOT !!! CMake has most likely not been installed correctly. Modul ...

  8. 多个if和一个ifelse的区别

    一个程序的要求如下,输入一个学生的数学成绩,如果大于等于60,那么就输出good,如果小于60那么输出not good int a scanf_s("%d",&a) if( ...

  9. hdu 2211 杀人游戏

    设f(N,K)返回最后取出的编号 那么f(n,k)进行第一次选后,剩下n-n/k个人,这剩下的人里最后被取出的编号为f(n-n/k,k)记为x 那么它在前一次队列里的编号则是(x-1)/(k-1)+x ...

  10. 基于.Net平台常用的组件和框架整理

    转载自:http://www.cnblogs.com/hgmyz/p/5313983.html 基于转载进行补充 RPC框架: RPC:远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而 ...