【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. PHP文件操作(二)-文件的读取

    1.fread()    //读取打开的文件 fread(file,length) file:必选项,规定要读取的打开的文件 length:必选项,规定要读取的最大字节数. <?php $fil ...

  2. List<T>直接充当Combox控件DataSource并扩展自定义记录的方法

    一般认为List只有转换为DataTable后才能充当CombBox的数据源,其实不然: List<SYS_COMMANDS> comdList = _menuMan.Load(c =&g ...

  3. http响应chunked格式分析

    有的时候服务器生成HTTP回应是无法确定信息大小的,这时用Content-Length就无法事先写入长度,而需要实时生成消息长度,这时服务器一般采用Chunked编码. 在进行Chunked编码传输时 ...

  4. Rhel6.0部署Oracle10g报错相关问题记录

    1.libawt.so及libXt.so.6,lib*系列报错,到最后的界面ruiy哥我笑了!.相信你也会笑的!终于找到根源了!哇哈哈!希望后面不要报error in invoking target ...

  5. 服务器实现处理GET和POST

    import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.Inp ...

  6. 【bzoj1479】[NOI2006]最大获利

    1497: [NOI2006]最大获利 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 4335  Solved: 2123[Submit][Status] ...

  7. MAT(Memory Analyzer tool)使用

    当线上环境出现OOM/内存泄漏了,怎么办? 让虚拟机在发生内存溢出时 Dump 出当前的内存堆转储快照,配置-XX:+HeapDumpOnOutOfMemoryError, 当出现OOM时,分析dum ...

  8. os.chdir("/deepmatching") OSError: [Errno 2] No such file or directory: '/deepmatching'

    #os.chdir("/deepmatching")os.chdir(os.path.dirname(os.path.abspath("deepmatching1&quo ...

  9. Linux设置串口波特率等参数

    转自 http://blog.csdn.net/zoomdy/article/details/50921336 mingdu.zheng at gmail dot com stty查看串口参数 stt ...

  10. 2.2开源的魅力:编译opencv源代码

    1.下载安装CMake 要在Windows平台下生成opencv的解决方案,需要一个名为CMake的开源软件.CMake的全称是crossplatform make.它是一个跨平台的安装(编译)工具, ...