[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.. ...
随机推荐
- 怎么用Sublime查找替换整个文件夹下的所有文件内容?
https://segmentfault.com/q/1010000003946095 工程目录下有很多图片路径要修改,很多散落在各个文件夹. 2015年11月03日提问 评论 邀请回答 编辑 4个回 ...
- Java泛型类和泛型方法
java编程思想说道: 泛型类是应用在整个类上,但同时可以在类中包含参数化方法,而这个方法所在的类可以是泛型,也可以不是泛型,也就是说是否有泛型方法,与其所在的类是否是泛型类没有关系. 泛型方法是的该 ...
- 数据结构 链式哈希表(Hash Table)的接口定义与实现分析(完整代码)
链式哈希表的接口定义 关于哈希表与链式哈希表的描述可以参阅:http://www.cnblogs.com/idreamo/p/7990860.html 链式哈希表的操作与属性有:初始化.销毁.插入元素 ...
- javascript学习日志:前言
javascript学习日志系列的所有博客,主要理论依据是<javascript权威指南>(犀牛书第6版)以及<javascript高级程序设计第三版>(红色书),目前js行业 ...
- ANSI C与C89、C99、C11区别差异
body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...
- 【转】ArcGIS中File Geodatabase与Personal Geodatabase的区别
原文地址:ArcGIS中File Geodatabase与Personal Geodatabase的区别作者:最爱忆宝贝 一.平台支援: 1.Personal Geodatabase:仅可在Windo ...
- 【转】MATLAB图形句柄(二)
MATLAB图形句柄 1.1 图形对象及其句柄 1.2 图形对象属性 1.3 图形对象的创建 1.1 图形对象及其句柄 1.图形对象 MATLAB的图形对象包括计算机屏幕.图形窗口.坐标轴 ...
- Eralng的常用数据结构
1.记录(record) 适用于小数据,并且用属性名方便查找 2.Key/Value 类型 a.属性列表 就是类似[{Key, Value}]的列表,可以通过proplists模块来处理这样的列表 当 ...
- 10个实用的 Linux 网络和监控命令[转]
本文列出了10个基础的每个Linux用户都应该知道的网络和监控命令.网络和监控命令类似于这些: hostname, ping, ifconfig, iwconfig, netstat, nslooku ...
- FastDFS角色配置参数思维导图