P3193 [HNOI2008]GT考试
容易看出是道DP
考虑一位一位填数字
设 f [ i ] [ j ] 表示填到第 i 位,在不吉利串上匹配到第 j 位时不出现不吉利数字的方案数
设 g [ i ] [ j ] 表示不吉利串匹配到第 i 位,再添加一个数字,使串匹配到第 j 位的方案数
那么方程显然为 :
注意我们不需要考虑 $j=m$ 的情况,因为 $j=m$时肯定已经出现匹配了
显然我们可以预处理出 g ,然后直接转移
最后答案就是
还有一个问题,n 太大了
发现 g 是固定的,把 g 搞成矩阵直接矩阵加速一下
复杂度$ O(log_n)$
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<iostream>
using namespace std;
typedef long long ll;
inline int read()
{
int x=,f=; char ch=getchar();
while(ch<''||ch>'') { if(ch=='-') f=-; ch=getchar(); }
while(ch>=''&&ch<='') { x=(x<<)+(x<<)+(ch^); ch=getchar(); }
return x*f;
}
const int N=;
int n,m,mo;
inline int fk(int x) { return x>=mo ? x-mo : x; }
int a[N],fail[N];
char s[N];
int g[N][N];
struct matrix//矩阵不解释
{
int a[N][N];
matrix () { memset(a,,sizeof(a)); }
inline matrix operator * (const matrix &tmp) const {
matrix res;
for(int i=;i<m;i++)
for(int j=;j<m;j++)
for(int k=;k<m;k++)
res.a[i][j]=fk(res.a[i][j]+a[i][k]*tmp.a[k][j]%mo);
return res;
}
}F,M;
inline matrix ksm(matrix x,int y)//矩阵快速幂不解释
{
matrix res;
for(int i=;i<=m;i++) res.a[i][i]=;
while(y)
{
if(y&) res=res*x;
x=x*x; y>>=;
}
return res;
}
inline void pre()//预处理,本人闲的蛋疼用kmp预处理g
{
int x=; fail[]=-;
for(int i=;i<=m;i++)
{
x=fail[i-]; while(x!=-&&a[x+]!=a[i]) x=fail[x];
fail[i]=x+;
}
fail[]=;
for(int i=;i<m;i++)
for(int j=;j<;j++)//枚举填的每个数字,看看能匹配到哪里
{
x=i; while(x&&a[x+]!=j) x=fail[x];
g[i][a[x+]==j ? x+ : x]++;//把匹配到的位置++
}
for(int i=;i<m;i++) for(int j=;j<m;j++) M.a[i][j]=g[i][j];//转移矩阵就是g
}
int main()
{
n=read(); m=read(); mo=read();
scanf("%s",s+);
for(int i=;i<=m;i++) a[i]=s[i]-''; a[m+]=a[]=-;//闲的蛋疼,就是爱转数字
pre(); F.a[][]=;//初始状态
F=F*ksm(M,n); int ans=;
for(int i=;i<m;i++) ans=fk(ans+F.a[][i]);
printf("%d",ans);
return ;
}
P3193 [HNOI2008]GT考试的更多相关文章
- bzoj1009 / P3193 [HNOI2008]GT考试
P3193 [HNOI2008]GT考试 设$f[i][j]$表示主串匹配到第$i$个位置,不吉利数字匹配到第$j$个位置 $g[i][j]$表示加上某数字使子串原来最多能匹配到第$i$个数字,现在只 ...
- P3193 [HNOI2008]GT考试(KMP+矩阵乘法加速dp)
P3193 [HNOI2008]GT考试 思路: 设\(dp(i,j)\)为\(N\)位数从高到低第\(i\)位时,不吉利数字在第\(j\)位时的情况总数,那么转移方程就为: \[dp(i,j)=dp ...
- 【KMP】【矩阵加速】【递推】洛谷 P3193 [HNOI2008]GT考试 题解
看出来矩阵加速也没看出来KMP…… 题目描述 阿申准备报名参加 GT 考试,准考证号为\(N\)位数\(X_1,X_2…X_n(0\le X_i\le9)\),他不希望准考证号上出现不吉利的数 ...
- 洛谷P3193 [HNOI2008]GT考试(dp 矩阵乘法)
题意 题目链接 Sol 设\(f[i][j]\)表示枚举到位置串的第i位,当前与未知串的第j位匹配,那么我们只要保证在转移的时候永远不会匹配即可 预处理出已知串的每个位置加上某个字符后能转移到的位置, ...
- luogu P3193 [HNOI2008]GT考试
传送门 单串匹配显然用\(kmp\) 一个暴力的dp是设\(f_{i,j}\),表示前\(i\)位,正在匹配给定串第\(j\)位的方案,转移就枚举下一位放什么,然后使用\(kmp\)看会匹配到给定串的 ...
- 洛谷P3193 [HNOI2008]GT考试 kmp+dp
正解:kmp+dp+矩阵优化 解题报告: 传送门! 啊刚说想做矩阵优化dp的字符串题就找到辣QwQ虽然不是AC自动机的但都差不多嘛QwQ 首先显然可以想到一个dp式?就f[i][j]:凑出i位了,在s ...
- 洛谷P3193 [HNOI2008]GT考试(KMP,矩阵)
传送门 大佬讲的真吼->这里 首先考虑dp,设$f[i][j]$表示长串匹配到第$i$位,短串最多匹配到$j$位时的方案数 那么答案就是$\sum_{i=0}^{m-1}f[n][i]$ 然后考 ...
- 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 ...
随机推荐
- Composite模式 组合模式
Android的ViewGroup 和 View 的关系,即是采用组合模式 1. 概述 在数据结构里面,树结构是很重要,我们可以把树的结构应用到设计模式里面. 例子1:就是多级树形菜单. 例子2:文件 ...
- 《Android安全机制解析与应用实践》笔记 第2章
Android扩展了Linux内核安全模型的用户与权限机制,将多用户操作系统的用户隔离机制巧妙地移植为应用程序隔离.在linux中,一个用户标识(UID)识别一个给定用户:在Android上,一个UI ...
- android中finish和system.exit方法退出的区别
finish只是将此activity推向后台,并没有释放资源. 而system.exit则是杀死进程,会释放资源
- opencv3.2加载图片
#include <opencv2/opencv.hpp>#include <iostream> using namespace cv;using namespace std; ...
- Ubuntu 添加用户到sudoers
ubuntu上的用户有时候需要用到管理员权限,可以通过修改 /etc/sudoers 文件内容添加用户权限. 操作方式 1. 首先以root进入系统打开文件 sudo vim /etc/sudoers ...
- loj10088 出纳员问题
传送门 分析 我们设pre[i]为到第i个时段的雇佣员工的总数量,sum[i]表示时段i的可雇佣员工的总数量,r[i]表示时段i所需工人的数量.由此我们不难求出: 0<=pre[i]-pre[i ...
- CF 1025C Plasticine zebra
昨晚忘记判只有一个字符的情况fst了呜呜呜 挺有趣的题,昨晚连刚带猜弄出结论 考虑答案的取值,最优答案可能是一个后缀,或者是一个前缀,或者是一个后缀加上前缀 那么翻转之后最优答案的可选值就有了1的前缀 ...
- 树莓派研究笔记(5)-- FM网络收音机
1. 安装mpc sudo apt-get install mpd mpc 2.添加流.注意,这里有个坑,如果下面这个地址不能用,那么就无法测试了.建议先下载一个龙卷风或者酷狗网络收音机,然后添加地址 ...
- PHP中抽象类与接口的区别
PHP中抽象类与接口的区别 抽象类abstract 概念 定义为抽象的类不能被实例化.任何一个类,如果有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的类. 继承一个抽象类的时候,子类必须定义 ...
- web 打印分页技巧
page-break-after 和 page-break-before: page-break-before和page-break-after CSS属性并不会修改网页在屏幕上的显示,这两个属性是 ...