LightOJ 1268 Unlucky Strings(KMP+矩阵乘法+基础DP)
题意
给出字符串的长度 \(n\) ,以及该字符串是由哪些小写字母组成,现给出一个坏串 \(S\) ,求存在多少种不同的字符串,使得其子串不含坏串。
\(1 \leq n \leq 10^9\)
\(1 \leq |S| \leq 50\)
思路
矩阵快速幂优化 \(\text{dp}\) 是真的常见,在同层状态数不多,但层数很多的时候,要考虑矩阵快速幂优化 \(\text{dp}\) 。
每一层的状态 \(dp[i]\) 表示匹配到哪里,再枚举给定的字母进行转移,只要不匹配到 \(S\) 结尾都是一个合法的转移,转移系数为 \(1\) 。剩下就是板子了。
代码
#include<bits/stdc++.h>
#define FOR(i,x,y) for(int i=(x),i##END=(y);i<=i##END;++i)
#define DOR(i,x,y) for(int i=(x),i##END=(y);i>=i##END;--i)
typedef long long LL;
typedef unsigned int uint;
using namespace std;
const int N=53;
struct Matrix
{
int n,m;uint a[N][N];
uint *operator [](const int x){return a[x];}
void resize(int _n,int _m){n=_n,m=_m;}
Matrix operator *(const Matrix &_)const
{
Matrix res;res.resize(n,_.m);
FOR(i,1,n)FOR(j,1,_.m)
{
res[i][j]=0;
FOR(k,1,m)res[i][j]+=a[i][k]*_.a[k][j];
}
return res;
}
Matrix operator *=(const Matrix &_){return (*this)=(*this)*_;}
}A,B;
char d_c[30],str[N];
int c_d[256];
int f[N],F[N][30];
int n,m,l;
Matrix Pow(Matrix a,int p)
{
Matrix res;res.resize(a.n,a.n);
FOR(i,1,res.n)FOR(j,1,res.n)res[i][j]=(i==j);
for(;p>0;p>>=1,a*=a)if(p&1)res*=a;
return res;
}
int main()
{
int Case;
scanf("%d",&Case);
FOR(cas,1,Case)
{
scanf("%d",&n);
scanf("%s",d_c+1);
scanf("%s",str+1);
l=strlen(d_c+1);
m=strlen(str+1);
FOR(i,1,l)c_d[(int)d_c[i]]=i;
f[1]=f[2]=1;FOR(i,1,l)F[1][i]=1+(i==c_d[(int)str[1]]);
FOR(i,2,m)
{
f[i+1]=F[f[i]][c_d[(int)str[i]]];
FOR(j,1,l)
{
if(c_d[(int)str[i]]==j)F[i][j]=i+1;
else F[i][j]=F[f[i]][j];
}
}
A.resize(1,m),B.resize(m,m);
FOR(i,1,m)A[1][i]=0;
FOR(i,1,m)FOR(j,1,m)B[i][j]=0;
A[1][1]=1;
FOR(i,1,m)FOR(j,1,l)if(F[i][j]<=m)B[i][F[i][j]]++;
A*=Pow(B,n);
uint ans=0;
FOR(i,1,m)ans+=A[1][i];
printf("Case %d: %u\n",cas,ans);
}
return 0;
}
LightOJ 1268 Unlucky Strings(KMP+矩阵乘法+基础DP)的更多相关文章
- LightOJ 1268 Unlucky Strings (KMP+矩阵快速幂)
题意:给出一个字符集和一个字符串和正整数n,问由给定字符集组成的所有长度为n的串中不以给定字符串为连续子串的有多少个? 析:n 实在是太大了,如果小的话,就可以用动态规划做了,所以只能用矩阵快速幂来做 ...
- P3193 [HNOI2008]GT考试(KMP+矩阵乘法加速dp)
P3193 [HNOI2008]GT考试 思路: 设\(dp(i,j)\)为\(N\)位数从高到低第\(i\)位时,不吉利数字在第\(j\)位时的情况总数,那么转移方程就为: \[dp(i,j)=dp ...
- bzoj 1009 [HNOI2008]GT考试(DP+KMP+矩阵乘法)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1009 [题意] 给定一个字符串T,问长度为n且不包含串T的字符串有多少种. [思路] ...
- 形态形成场(矩阵乘法优化dp)
形态形成场(矩阵乘法优化dp) 短信中将会涉及前\(k\)种大写字母,每个大写字母都有一个对应的替换式\(Si\),替换式中只会出现大写字母和数字,比如\(A→BB,B→CC0,C→123\),代表 ...
- 【bzoj1778】[Usaco2010 Hol]Dotp 驱逐猪猡 矩阵乘法+概率dp+高斯消元
题目描述 奶牛们建立了一个随机化的臭气炸弹来驱逐猪猡.猪猡的文明包含1到N (2 <= N <= 300)一共N个猪城.这些城市由M (1 <= M <= 44,850)条由两 ...
- 斐波那契数列 矩阵乘法优化DP
斐波那契数列 矩阵乘法优化DP 求\(f(n) \%1000000007\),\(n\le 10^{18}\) 矩阵乘法:\(i\times k\)的矩阵\(A\)乘\(k\times j\)的矩 ...
- HNOI2008 GT考试 (KMP + 矩阵乘法)
传送门 这道题目的题意描述,通俗一点说就是这样:有一个长度为n的数字串(其中每一位都可以是0到9之间任意一个数字),给定一个长度为m的模式串,求有多少种情况,使得此模式串不为数字串的任意一个子串.结果 ...
- BZOJ_1009_[HNOI2008]_GT考试_(动态规划+kmp+矩阵乘法优化+快速幂)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1009 字符串全部由0~9组成,给出一个串s,求一个长度为n的串,不包含s的种类有多少. 分析 ...
- [bzoj1009][HNOI2008]GT考试——KMP+矩阵乘法
Brief Description 给定一个长度为m的禁止字符串,求出长度为n的字符串的个数,满足: 这个字符串的任何一个字串都不等于给定字符串. 本题是POJ3691的弱化版本. Algorithm ...
随机推荐
- jQuery工具--jQuery.isNumeric(value)和jQuery.trim(str)
jQuery.isNumeric(value) 概述 确定它的参数是否是一个数字. $.isNumeric() 方法检查它的参数是否代表一个数值.如果是这样,它返回 true.否则,它返回false. ...
- First Wainberg-2018-Deep learning in biomedicine Experience
ppt+paper 链接:https://pan.baidu.com/s/14toqjcSJti5ZXT3ff4rwIA 提取码:xgkt
- python SQLite说一点点, python使用数据库需要注意的几点
SQLite是一种嵌入式数据库,它的数据库就是一个文件.由于SQLite本身是C写的,而且体积很小,所以,经常被集成到各种应用程序中,甚至在iOS和Android的App中都可以集成. Python就 ...
- php获得可靠的精准的当前时间 ( 通过授时服务器 )
有一种情形是这样子的,比如机票业务中的订票流程,我们需要一个非常可靠的当前时间来支持,尽管大多数服务器的时间是非常准确的,我们使用time()来获取的时间是可靠的,但未免会有不确切的情况,也有的服务器 ...
- 51nod 1130 N的阶乘的长度 V2(斯特林近似)
输入N求N的阶乘的10进制表示的长度.例如6! = 720,长度为3. Input 第1行:一个数T,表示后面用作输入测试的数的数量.(1 <= T <= 1000) 第2 - T + ...
- 判断是移动端还是PC端
// 判断是移动端还是PC端 $http_user_agent = isset($_SERVER['HTTP_USER_AGENT']) ? strtolower($_SERVER['HTTP_USE ...
- body中相关标签
一.字体标签 字体标签包含:h1~h6.<font>.<u>.<b>.<strong><em>.<sup>.<sub> ...
- mycat分片操作
mycat位于应用与数据库的中间层,可以灵活解耦应用与数据库,后端数据库可以位于不同的主机上.在mycat中将表分为两大类:对于数据量小且不需要做数据切片的表,称之为分片表:对于数据量大到单库性能,容 ...
- windows下使用命令行运行PHP
之前一直想,在命令行下能不能运行PHP程序,像C语言一样可以通过命令行拿到参数.今天尝试了一下发现可感觉挺有意思的,平时写着程序玩的时候就可以这样用,下面让咱么来看看怎么做的.我的环境是 php5.6 ...
- Golang通过git clone beego框架报错 error: while accessing https://github.com/astaxie/beego/info/refs fatal: HTTP request failed package github.com/astaxie/beego: exit status 128
在Centos6.4尝试搭建beego框架,使用git命令clone时报错 # cd .; git clone https://github.com/astaxie/beego /www/projec ...