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的更多相关文章

  1. AC日记——[HNOI2008]玩具装箱toy bzoj 1010

    1010 思路: 斜率优化DP: 跪烂大佬 代码: #include <bits/stdc++.h> using namespace std; #define maxn 50005 #de ...

  2. AC日记——[HNOI2008]越狱 bzoj 1008

    1008 思路: 越狱情况=总情况-不越狱情况: 代码: #include <cstdio> #include <cstring> #include <iostream& ...

  3. AC日记——[HNOI2008]水平可见直线 bzoj 1007

    1007 思路: 维护一个下凸壳: 用单调栈来维护这玩意儿: 先将斜率排序: 然后判断栈顶元素和当前元素的交点x是否小于栈顶元素和栈顶上一个元素的交点x: 注意: 人神共愤的精度问题和输出空格问题: ...

  4. AC日记——[HEOI2012]旅行问题 bzoj 2746

    2746 思路: 建立ac自动机,然后把fail树抽出来: 然后在fail树上走lca(神奇): 代码: #include <cstdio> #include <vector> ...

  5. AC日记——[SCOI2010]幸运数字 bzoj 1853

    1853: [Scoi2010]幸运数字 Time Limit: 2 Sec  Memory Limit: 64 MBSubmit: 2405  Solved: 887[Submit][Status] ...

  6. GT考试 BZOJ 1009

    GT考试 [问题描述] 阿申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字. 他的不吉利数学A1A2...Am(0< ...

  7. AC日记——明明的烦恼 bzoj 1005

    1005 思路: prufer编码+组合数: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 1005 #de ...

  8. AC日记——Mato的文件管理 bzoj 3289

    3289 思路: 莫队求区间逆序对个数,树状数组维护: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 500 ...

  9. AC日记——[Scoi2010]序列操作 bzoj 1858

    1858 思路: 恶心: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 100005 struct Tree ...

随机推荐

  1. 使用Faster-Rcnn进行目标检测(实践篇)转载

    原 文链接:http://blog.csdn.net/gavin__zhou/article/details/52052915 原理 上一篇文章,已经说过了,大家可以参考一下,Faster-Rcnn进 ...

  2. HDU 2655 主席树

    Kth number Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  3. 洛谷P3065 [USACO12DEC]第一!First!(Trie树+拓扑排序)

    P3065 [USACO12DEC]第一!First! 题目链接:https://www.luogu.org/problemnew/show/P3065 题目描述 Bessie一直在研究字符串.她发现 ...

  4. 使用自己的数据集训练和测试"caffenet"

    主要步骤可参考: http://blog.csdn.net/u010194274/article/details/50575284 补充几点: 1. convert函数是ImageMagick包里面的 ...

  5. Qt ------- QByteArray操作注意

    使用QByteArray方法把数据存入QByteArray需要是char型数据,如果需要存入无符号8位数据,如下: QByteArray data; data[0] = 0xFF; 即使通过data[ ...

  6. sql获取当前时间

    sql读取系统日期和时间的方法如下:--获取当前日期(如:yyyymmdd) select CONVERT (nvarchar(12),GETDATE(),112) --获取当前日期(如:yyyymm ...

  7. $.ajax() 方法的理解

    jquery中的ajax方法理解,AJAX即“Asynchronous Javascript And XML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术.AJAX ...

  8. 2015/9/20 Python基础(16):类和实例

    面向对象编程编程的发展已经从简单控制流中按步的指令序列进入到更有组织的方式中,依靠代码块可以形成命名子程序和完成既定的功能.结构化的或过程性编程可以让我们把程序组织成逻辑快,以便重复或重用.创造程序的 ...

  9. MyBatis框架的使用及源码分析(六) MapperRegistry

    我们先Mapper接口的调用方式,见<MyBatis框架中Mapper映射配置的使用及原理解析(一) 配置与使用>的示例: public void findUserById() { Sql ...

  10. 【BZOJ】1724 [Usaco2006 Nov]Fence Repair 切割木板

    [算法]贪心+堆 #include<cstdio> #include<algorithm> using namespace std; ; int n,heap[maxn],sz ...