AC日记——[HNOI2008]GT考试 bzoj 1009
思路:
KMP上走DP(矩阵加速);
DP[i][j]表示当前在第i位,同是匹配到不吉利串的第j位的方案数;
代码:
#include <bits/stdc++.h>
using namespace std;
int mod;
struct MatrixType {
int n,m,ai[][];
void mem(int n_,int m_)
{
n=n_,m=m_;
for(int i=;i<=n;i++)
{
for(int v=;v<=m;v++) ai[i][v]=;
}
}
MatrixType operator*(const MatrixType pos)const
{
MatrixType res;
res.mem(n,pos.m);
for(int i=;i<=res.n;i++)
{
for(int k=;k<=res.m;k++)
{
for(int v=;v<=m;v++) res.ai[i][k]=(res.ai[i][k]+(ai[i][v]*pos.ai[v][k])%mod)%mod;
}
}
return res;
}
void debug()
{
puts("");
for(int i=;i<=n;i++)
{
for(int v=;v<=m;v++) printf("%d ",ai[i][v]);
putchar('\n');
}
puts("");
}
};
int n,m,ti[],Next[],last[],to[][];
void poww(MatrixType res,MatrixType pos,int mi)
{
while(mi)
{
if(mi&) res=res*pos;
mi=mi>>,pos=pos*pos;
}
long long ans=;
for(int i=;i<m;i++) ans=(ans+res.ai[][i])%mod;
cout<<ans;
}
int main()
{
freopen("data.txt","r",stdin);
scanf("%d%d%d",&n,&m,&mod);
char ch[];scanf("%s",ch+);
for(int i=;i<=m;i++) ti[i]=ch[i]-'';
for(int i=;i<m;i++)
{
int v=Next[i];
while(v&&ti[i+]!=ti[v+]) v=Next[v];
Next[i+]=ti[i+]==ti[v+]?v+:;
}
for(int i=;i<m;i++)
{
for(int v=;v<=;v++)
{
to[i][v]=ti[i+]==v?i+:to[Next[i]][v];
}
}
MatrixType sta,tmp;
sta.mem(,m-),sta.ai[][]=;
tmp.mem(m-,m-);
for(int i=;i<m;i++)
{
for(int v=;v<=;v++)
{
if(to[i][v]!=m) tmp.ai[i][to[i][v]]++;
}
}
poww(sta,tmp,n);
return ;
}
AC日记——[HNOI2008]GT考试 bzoj 1009的更多相关文章
- AC日记——[HNOI2008]玩具装箱toy bzoj 1010
1010 思路: 斜率优化DP: 跪烂大佬 代码: #include <bits/stdc++.h> using namespace std; #define maxn 50005 #de ...
- AC日记——[HNOI2008]越狱 bzoj 1008
1008 思路: 越狱情况=总情况-不越狱情况: 代码: #include <cstdio> #include <cstring> #include <iostream& ...
- AC日记——[HNOI2008]水平可见直线 bzoj 1007
1007 思路: 维护一个下凸壳: 用单调栈来维护这玩意儿: 先将斜率排序: 然后判断栈顶元素和当前元素的交点x是否小于栈顶元素和栈顶上一个元素的交点x: 注意: 人神共愤的精度问题和输出空格问题: ...
- AC日记——[HEOI2012]旅行问题 bzoj 2746
2746 思路: 建立ac自动机,然后把fail树抽出来: 然后在fail树上走lca(神奇): 代码: #include <cstdio> #include <vector> ...
- AC日记——[SCOI2010]幸运数字 bzoj 1853
1853: [Scoi2010]幸运数字 Time Limit: 2 Sec Memory Limit: 64 MBSubmit: 2405 Solved: 887[Submit][Status] ...
- GT考试 BZOJ 1009
GT考试 [问题描述] 阿申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字. 他的不吉利数学A1A2...Am(0< ...
- AC日记——明明的烦恼 bzoj 1005
1005 思路: prufer编码+组合数: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 1005 #de ...
- AC日记——Mato的文件管理 bzoj 3289
3289 思路: 莫队求区间逆序对个数,树状数组维护: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 500 ...
- AC日记——[Scoi2010]序列操作 bzoj 1858
1858 思路: 恶心: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 100005 struct Tree ...
随机推荐
- stout代码分析之三:Option类
为了安全表示NULL, stout实现了Option类.Option对象有两种状态: enum State { SOME, NONE, }; 其中SOME表示非空,NONE表示为空.可通过isSome ...
- Leetcode 381. O(1) 时间插入、删除和获取随机元素 - 允许重复
1.题目描述 设计一个支持在平均 时间复杂度 O(1) 下, 执行以下操作的数据结构. 注意: 允许出现重复元素. insert(val):向集合中插入元素 val. remove(val):当 va ...
- HDU3524 数论
Perfect Squares Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)T ...
- ubuntu 14.04 安装win7虚拟机
主机OS:ubuntu 14.04 virtual box:http://download.virtualbox.org/virtualbox/5.1.28/virtualbox-5.1_5.1.28 ...
- redis安装----非基于lnmp安装
在 Ubuntu 系统安装 Redi 可以使用以下命令: $sudo apt-get update $sudo apt-get install redis-server 启动 Redis $ redi ...
- 利用pdfJS实现以读取文件流方式在线展示pdf文件
第一步:下载源码https://github.com/mozilla/pdf.js 第二步:构建PDF.js 第三步:修改viewer.js var DEFAULT_URL = 'compressed ...
- windows修改文件的修改或者创建时间
https://www.online-tech-tips.com/computer-tips/how-to-change-the-last-modified-date-creation-date-an ...
- 在此位置打开CMD
Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\folder\shell\cmd]@="在此位置打开CMD"[HKE ...
- debussy与modelsim的联调设置
前段时间看到网上有人在使用debussy软件对Verilog代码进行调试,而且都称赞其是多么的好用,看着很是馋人,说吧,现在用的是quartus与modelsim的联调,似乎还是可以的,但就是每次稍微 ...
- 【转载】VS2013安装需要IE10
因为需要移动办公,需要给笔记本搭建编程环境.安装VS2013时遇到了小麻烦,提示我,需要安装IE10. 然后我很听话的按照提供的超链接,到了官网,下载了最新的IE11,然后安装,结果告诉我下载的IE版 ...