[HNOI2008] GT考试
[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考试的更多相关文章
- 1009: [HNOI2008]GT考试
1009: [HNOI2008]GT考试 Time Limit: 1 Sec Memory Limit: 162 MB Description 阿申准备报名参加GT考试,准考证号为N位数\(X_1X_ ...
- 【bzoj1009】[HNOI2008]GT考试
1009: [HNOI2008]GT考试 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 3018 Solved: 1856[Submit][Statu ...
- BZOJ_1009_[HNOI2008]_GT考试_(动态规划+kmp+矩阵乘法优化+快速幂)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1009 字符串全部由0~9组成,给出一个串s,求一个长度为n的串,不包含s的种类有多少. 分析 ...
- BZOJ 1009: [HNOI2008]GT考试( dp + 矩阵快速幂 + kmp )
写了一个早上...就因为把长度为m的也算进去了... dp(i, j)表示准考证号前i个字符匹配了不吉利数字前j个的方案数. kmp预处理, 然后对于j进行枚举, 对数字0~9也枚举算出f(i, j) ...
- BZOJ_1009_[HNOI2008]GT考试_KMP+矩阵乘法
BZOJ_1009_[HNOI2008]GT考试_KMP+矩阵乘法 Description 阿申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考 ...
- BZOJ1009 [HNOI2008]GT考试 矩阵
去博客园看该题解 题目 [bzoj1009][HNOI2008]GT考试 Description 阿申准备报名参加GT考试,准考证号为N位数X1X2….Xn(0<=Xi<=9),他不希望准 ...
- BZOJ 1009 [HNOI2008]GT考试 (KMP + 矩阵快速幂)
1009: [HNOI2008]GT考试 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 4266 Solved: 2616[Submit][Statu ...
- bzoj1009 / P3193 [HNOI2008]GT考试
P3193 [HNOI2008]GT考试 设$f[i][j]$表示主串匹配到第$i$个位置,不吉利数字匹配到第$j$个位置 $g[i][j]$表示加上某数字使子串原来最多能匹配到第$i$个数字,现在只 ...
- bzoj 1009: [HNOI2008]GT考试 -- KMP+矩阵
1009: [HNOI2008]GT考试 Time Limit: 1 Sec Memory Limit: 162 MB Description 阿申准备报名参加GT考试,准考证号为N位数X1X2.. ...
随机推荐
- LAMP和LNMP,你更愿意选择谁,为什么?
https://www.zhihu.com/question/19697826 http://www.simongong.net lamp 的全称是linux + apache + mysql +ph ...
- [SinGuLaRiTy] 复习模板-搜索
[SinGuLaRiTy-1043] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. 桶排序 void bucketSort(int a[], ...
- sqlite数据库的char,varchar,text,nchar,nvarchar,ntext的区别
1.CHAR.CHAR存储定长数据很方便,CHAR字段上的索引效率级高,比如定义char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间,不足的自动用空格填充. 2.VAR ...
- pyspider解析
https://www.cnblogs.com/microman/p/6111711.html #!/usr/bin/env python # -*- encoding: utf-8 -*- # Cr ...
- BOM基础知识
1.什么是BOM BOM(Browser Object Document)即浏览器对象模型. BOM提供了独立于内容 而与浏览器窗口进行交互的对象: 由于BOM主要用于管 ...
- Python的交叉编译移植至arm板
虽然网上有那么多python的交叉编译移植教程,但是方法差异蛮大,需要根据实际开发板的型号做调整,以下是适用于海思的板子移植过程. step 1. python版本从网上下就可以: step 2. 解 ...
- 共轭梯度算法求最小值-scipy
# coding=utf-8 #共轭梯度算法求最小值 import numpy as np from scipy import optimize def f(x, *args): u, v = x a ...
- WebP 图片实践之路
我们会从三部分来聊聊webp这个话题. 什么是webp,它有什么用? 使用webp的常规方法以及优劣. 我们是如何用上webp的. PS:如果是对webp有一定了解的朋友,建议直接看第三部分.因为是讲 ...
- aliyun 购买的linux安装tomcat
按照网上的教程,下载tomcat,解压(即安装),启动,发现无法访问.有说端口未开放,修改/etc/sysconfig/iptables,添加端口开放.未发现有此文件,只有iptables-confg ...
- js中的一元加法和一元减法
大多数人都熟悉一元加法和一元减法,它们在 ECMAScript 中的用法与您高中数学中学到的用法相同. 一元加法本质上对数字无任何影响: var iNum = 20; iNum = +iNum; al ...