[HNOI2008] GT考试

标签 : DP 矩阵乘法


题目链接

题意

n位数中不出现一个子串的方案数。

题解

\(设dp[i][j]\)为前i位匹配到j时的合法方案数。(所谓合法,就是不能有别的匹配更多或相同)

然后显然\(dp[i][j]=dp[i-1][k]×a[k][j],a[k][j]\)代表从k位加一个数字j的数字个数。

然后这是一个线性的递推,直接上矩阵加速。

最后要求的答案就是 \(\sum_{i=0}^{m-1} dp[n][i]\)。

Code

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<set>
#include<map>
using namespace std;
#define ll long long
#define REP(i,a,b) for(int i=(a),_end_=(b);i<=_end_;i++)
#define DREP(i,a,b) for(int i=(a),_end_=(b);i>=_end_;i--)
#define EREP(i,a) for(int i=start[(a)];i;i=e[i].next)
inline int read()
{
int sum=0,p=1;char ch=getchar();
while(!(('0'<=ch && ch<='9') || ch=='-'))ch=getchar();
if(ch=='-')p=-1,ch=getchar();
while('0'<=ch && ch<='9')sum=sum*10+ch-48,ch=getchar();
return sum*p;
} const int maxn=52;
int n,m,mod; struct matrix {
int n,m;
int g[52][52];
void Matrix()
{
n=m=0;memset(g,0,sizeof(g));
} matrix operator * (matrix a)const
{
matrix b;
b.Matrix();
b.n=n;b.m=a.m;
REP(i,0,b.n-1)
{
REP(j,0,b.m-1)
{
REP(k,0,m-1)b.g[i][j]=(b.g[i][j]+g[i][k]*a.g[k][j])%mod;
}
}
return b;
} };
char str[maxn];int nxt[maxn]; matrix make_new()
{
matrix a;
a.Matrix();
a.n=a.m=m;
REP(i,0,m-1)
{
REP(j,0,9)
{
int x=i;
while(x && str[x+1]-'0'!=j)x=nxt[x];
if(str[x+1]-'0'==j)a.g[i][x+1]++;
else a.g[i][0]++;
}
}
return a;
} void init()
{
n=read();m=read();mod=read();
cin>>(str+1);
str[0]='-';
nxt[1]=0;
REP(i,2,m)
{
int j=nxt[i-1];
while(j && str[j+1]!=str[i])j=nxt[j];
if(str[j+1]==str[i])nxt[i]=j+1;
else nxt[i]=0;
}
} matrix Init(int n)
{
matrix c;
c.Matrix();
c.n=c.m=n;
REP(i,0,n-1)c.g[i][i]=1;
return c;
} void doing()
{
matrix ans=Init(m),a=make_new();
int k=n;
while(k)
{
if(k & 1)ans=ans * a;
k>>=1;
a=a * a;
}
ll anss=0;
REP(i,0,m-1)anss=(anss+ans.g[0][i])%mod;
cout<<anss<<endl;
} int main()
{
freopen("input.in","r",stdin);
freopen("output.out","w",stdout);
init();
doing();
return 0;
}

[HNOI2008] GT考试的更多相关文章

  1. 1009: [HNOI2008]GT考试

    1009: [HNOI2008]GT考试 Time Limit: 1 Sec Memory Limit: 162 MB Description 阿申准备报名参加GT考试,准考证号为N位数\(X_1X_ ...

  2. 【bzoj1009】[HNOI2008]GT考试

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

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

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1009 字符串全部由0~9组成,给出一个串s,求一个长度为n的串,不包含s的种类有多少. 分析 ...

  4. BZOJ 1009: [HNOI2008]GT考试( dp + 矩阵快速幂 + kmp )

    写了一个早上...就因为把长度为m的也算进去了... dp(i, j)表示准考证号前i个字符匹配了不吉利数字前j个的方案数. kmp预处理, 然后对于j进行枚举, 对数字0~9也枚举算出f(i, j) ...

  5. BZOJ_1009_[HNOI2008]GT考试_KMP+矩阵乘法

    BZOJ_1009_[HNOI2008]GT考试_KMP+矩阵乘法 Description 阿申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考 ...

  6. BZOJ1009 [HNOI2008]GT考试 矩阵

    去博客园看该题解 题目 [bzoj1009][HNOI2008]GT考试 Description 阿申准备报名参加GT考试,准考证号为N位数X1X2….Xn(0<=Xi<=9),他不希望准 ...

  7. BZOJ 1009 [HNOI2008]GT考试 (KMP + 矩阵快速幂)

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

  8. bzoj1009 / P3193 [HNOI2008]GT考试

    P3193 [HNOI2008]GT考试 设$f[i][j]$表示主串匹配到第$i$个位置,不吉利数字匹配到第$j$个位置 $g[i][j]$表示加上某数字使子串原来最多能匹配到第$i$个数字,现在只 ...

  9. bzoj 1009: [HNOI2008]GT考试 -- KMP+矩阵

    1009: [HNOI2008]GT考试 Time Limit: 1 Sec  Memory Limit: 162 MB Description 阿申准备报名参加GT考试,准考证号为N位数X1X2.. ...

随机推荐

  1. LAMP和LNMP,你更愿意选择谁,为什么?

    https://www.zhihu.com/question/19697826 http://www.simongong.net lamp 的全称是linux + apache + mysql +ph ...

  2. [SinGuLaRiTy] 复习模板-搜索

    [SinGuLaRiTy-1043] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. 桶排序 void bucketSort(int a[], ...

  3. sqlite数据库的char,varchar,text,nchar,nvarchar,ntext的区别

    1.CHAR.CHAR存储定长数据很方便,CHAR字段上的索引效率级高,比如定义char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间,不足的自动用空格填充. 2.VAR ...

  4. pyspider解析

    https://www.cnblogs.com/microman/p/6111711.html #!/usr/bin/env python # -*- encoding: utf-8 -*- # Cr ...

  5. BOM基础知识

    1.什么是BOM      BOM(Browser Object Document)即浏览器对象模型.      BOM提供了独立于内容 而与浏览器窗口进行交互的对象:      由于BOM主要用于管 ...

  6. Python的交叉编译移植至arm板

    虽然网上有那么多python的交叉编译移植教程,但是方法差异蛮大,需要根据实际开发板的型号做调整,以下是适用于海思的板子移植过程. step 1. python版本从网上下就可以: step 2. 解 ...

  7. 共轭梯度算法求最小值-scipy

    # coding=utf-8 #共轭梯度算法求最小值 import numpy as np from scipy import optimize def f(x, *args): u, v = x a ...

  8. WebP 图片实践之路

    我们会从三部分来聊聊webp这个话题. 什么是webp,它有什么用? 使用webp的常规方法以及优劣. 我们是如何用上webp的. PS:如果是对webp有一定了解的朋友,建议直接看第三部分.因为是讲 ...

  9. aliyun 购买的linux安装tomcat

    按照网上的教程,下载tomcat,解压(即安装),启动,发现无法访问.有说端口未开放,修改/etc/sysconfig/iptables,添加端口开放.未发现有此文件,只有iptables-confg ...

  10. js中的一元加法和一元减法

    大多数人都熟悉一元加法和一元减法,它们在 ECMAScript 中的用法与您高中数学中学到的用法相同. 一元加法本质上对数字无任何影响: var iNum = 20; iNum = +iNum; al ...