[HNOI2008]GT考试(kmp,dp,矩阵乘法)
2024-09-04 02:23:32
- Description
求有多少个n位的数字串不包含m位的字符串(范围 n <= 1e9 n<=1e9, m <= 20m<=20)
- Solution
f[i][j]表示以数字串i位结尾有j个匹配的字符
g[i][j]表示从i个字符匹配到j个字符匹配的方案数
dp方程如下:
f[i][j]=f[i-1][k]*g[k][j] (0<=k<m)
发现g数组可以用kmp预处理出来,然后上矩阵乘法
- Code
#include <cstdio>
#include <cstdlib>
#include <cstring>
#define ll long long
using namespace std;
const int N=;
ll n,p,g[N][N],d[N][N],pre[N][N];
int m,nxt[N];
char s[N];
void mul1()
{
memset(pre,,sizeof(pre));
for(int i=;i<m;i++)
for(int j=;j<m;j++)
for(int k=;k<m;k++)
pre[i][j]=(pre[i][j]+g[i][k]*g[k][j])%p;
for(int i=;i<m;i++)
for(int j=;j<m;j++)
g[i][j]=pre[i][j]%p;
}
void mul2()
{
memset(pre,,sizeof(pre));
for(int i=;i<m;i++)
for(int j=;j<m;j++)
for(int k=;k<m;k++)
pre[i][j]=(pre[i][j]+d[i][k]*g[k][j])%p;
for(int i=;i<m;i++)
for(int j=;j<m;j++)
d[i][j]=pre[i][j]%p;
}
void ksm(ll x)
{
while(x)
{
if(x&) mul2();
mul1(),x>>=;
}
}
int main()
{
scanf("%lld%d%lld",&n,&m,&p);
scanf("%s",s+);
nxt[]=;
int k=;
for(int i=;s[i];i++)
{
while(k> && s[k+]!=s[i]) k=nxt[k];
if(s[k+]==s[i]) k++;
nxt[i]=k;
}
for(int i=;i<m;i++)
for(int j=;j<=;j++)
{
char wh=''+j;
int k=i;
while(k && s[k+]!=wh) k=nxt[k];
if(s[k+]==wh) k++;
if(k<m) g[i][k]++;
}
for(int i=;i<m;i++) d[i][i]=;
ksm(n);
ll ans=;
for(int i=;i<m;i++)
ans=(ans+d[][i])%p;
printf("%lld\n",ans%p);
return ;
}
最新文章
- wap支付宝接口的问题
- Day1(2016/1/21)——Beginning
- STL--vector(转载)
- 服务器端spice配置详解
- jquery判断浏览器版本插件,jquery-browser.js
- MarkDown使用 (一)
- 关于grub的那些事(三)
- [置顶] Oracle学习经验谈
- JavaScript特效制作经典精讲(案例入门详解、可直接粘贴拷贝运行、史上最牛案例)
- 15套java架构师大型分布式综合项目实战、千万高并发-视频教程
- Java学习6——基本数据类型及其转换
- Docker搭建MongoDB
- Charles手机抓包常见问题(各种常见坑)
- GNU C 与 ANSI C(上)
- Angularjs 学习笔记-2017-02-05-初识Angular及app、model、controller、repeat指令和fileter、orderBy
- eclipse 编辑代码区字体大小
- 转: linux centos7 下安装maven
- Linux之包管理工具总结[RPM/DPKG]-[YUM/APT]
- SpringBoot与docker
- position的absolute与fixed,absolute与relative共同点与不同点
热门文章
- MFC入门
- web.config修改文件修改上传大小
- Raid相关操作与注意事项记录
- 适配器模式 iOS
- 对QT中QBitArray类进行简单剖析
- TCP/IP|| 建立连接或终止
- 021 Ceph关于too few PGs per OSD的问题
- C++版本的UnEscape 解析\uxxxx\uxxxx编码字符
- 洛谷$P4322\ [JSOI2016]$最佳团体 二分+$dp$
- 洛谷$P4149\ [IOI2011]\ Race$ 点分治