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 ...
随机推荐
- How far away ? LCA求树上两点距离
How far away ? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- STM32 - 软件设置单片机重启
__set_FAULTMASK();//关闭总中断 NVIC_SystemReset();//请求单片机重启 执行NVIC_SystemReset()函数不允许被打断,所以关总中断
- Android核心类源码分析
Handler流程1.首先Looper.prepare()在本线程中保存一个Looper实例,然后该实例中保存一个MessageQueue对象:因为Looper.prepare()在一个线程中只能调用 ...
- Moq/moq4
moq The most popular and friendly mocking framework for .NET var mock = new Mock<ILoveThisFramewo ...
- angularJs $resource自定义方法(待完善)
配置CompanyService var services = angular.module('liaoyuan.services'); services.factory('CompanyServic ...
- android程序员成长路径的思考
我之前就想过要写这个话题,不过之前没有什么认识,我只是在阅读别人的见解,看法.昨天晚上,我阅读了这篇文章<产品经理罗永浩:用户体验探索,没有尽头>,这篇文章描述了罗永浩对锤子手机设计细节的 ...
- 【NOIP】提高组2014 解方程
[题意]已知n次方程(n<=100)及其所有系数(|ai|<=10^10000),求[1,m]中整数解的个数(m<=10^6). [算法]数论 [题解]如果f(x)=0,则有f(x) ...
- 【codevs】3196 黄金宝藏
[算法]区间DP+博弈论 [题解]其实它都不是博弈题…… 很自然的可以设f[i][j]表示i~j先手可取得的最大价值. 容易得到转移式:f[i][j]=max(a[i]+sum[i+1~j]-f[i+ ...
- 关于scala 集合 List Map Set
1,数组 2,List,ListBuffer 3, Map , mutable.Map
- js中三种定义变量 const, var, let 的区别
js中三种定义变量的方式const, var, let的区别 1.const定义的变量不可以修改,而且必须初始化. 1 const b = 2;//正确 2 // const b;//错误,必须初始化 ...