【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. VMware虚拟机上网络连接模式bridged(桥接模式)

    VMware虚拟机上网络连接模式bridged(桥接模式)的实质就是虚拟机本身利用主机的网卡对外直接作为一个真实的物理主机存在. 也就是理论上此时的虚拟机和主机没什么关系,只是和主机公用了一块网卡,其 ...

  2. linux中内存使用,swap,cache,buffer的含义总结

    首先介绍一下linux中内存是如何使用的.当有应用需要读写磁盘数据时,由系统把相关数据从磁盘读取到内存,如果物理内存不够,则把内存中的部分数据导入到磁盘,从而把磁盘的部分空间当作虚拟内存来使用,也称为 ...

  3. L1,L2范数和正则化 到lasso ridge regression

    一.范数 L1.L2这种在机器学习方面叫做正则化,统计学领域的人喊她惩罚项,数学界会喊她范数. L0范数  表示向量xx中非零元素的个数. L1范数  表示向量中非零元素的绝对值之和. L2范数  表 ...

  4. python ftp 上传

    #!/usr/bin/python # -*-coding:utf- -*- from ftplib import FTP def ftpconnect(host,username,password) ...

  5. MySQL5.7 在CentOS 下的安装

    尝试了在版本的CentOS6.6 和CentOS7.2 下安装,在6.6下比较复杂些.特地做下记录 在CentOS7.2 下安装,需要在官网下载 mysql-5.7.16-1.el7.x86_64.r ...

  6. 【原】Coursera—Andrew Ng机器学习—Week 2 习题—Linear Regression with Multiple Variables 多变量线性回归

    Gradient Descent for Multiple Variables [1]多变量线性模型  代价函数 Answer:AB [2]Feature Scaling 特征缩放 Answer:D ...

  7. java5 Condition用法--实现线程间的通信

    Condition的功能类似在传统线程技术中的Object.wait()和Object.natify()的功能,传统线程技术实现的互斥只能一个线程单独干,不能说这个线程干完了通知另一个线程来干,Con ...

  8. window - BOM对象

    Window 对象 Window 对象表示浏览器中打开的窗口. 如果文档包含框架(frame 或 iframe 标签),浏览器会为 HTML 文档创建一个 window 对象,并为每个框架创建一个额外 ...

  9. java基础之多线程三:多线程并发同步

    由于线程的执行是CPU随机调度的,比如我们开启10个线程,这10个线程并不是同时执行的,而是CPU快速的在这10个线程之间切换执行,由于切换速度极快使我们感觉同时执行罢了. 线程同步问题往往发生在多个 ...

  10. linux tcpdump补充

    If they are going across the loopback interface, you may have to tell tcpdump to read that interface ...