题目描述

某日mhy12345在教同学们写helloworld,要求同学们用程序输出一个给定长度的字符串,然而发现有些人输出了一些“危险”的东西,所以mhy12345想知道对于任意长度n的小写字母字符串,不包含危险串的字符串个数

数据范围

对于10%的数据,|str|=1

对于另30%的数据,n<=5

对于另30%的数据,危险串不存在相同字符

对于100%的数据,0<=|str|<=100,0<=n<=10000

解法

动态规划。

设f[i][j]表示到第i个字母,匹配到危险串的第j个字符。

显然

f[i][j]⇒f[i+1][pos[j][k]]

pos[i][j]表示使用j这个字符匹配错误串,fail到的位置。

这个东西可以使用KMP得出。

代码

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#define write(x) (cout<<(x)<<" ")
#define writeln(x) (cout<<(x)<<endl)
#define ll long long
using namespace std;
const char* fin="helloworld.in";
const char* fout="helloworld.out";
const ll inf=0x7fffffff;
const ll maxn=10007,maxm=107,mo=1000000007;
ll n,m,i,j,k,ans;
char a[maxm];
ll f[maxn][maxm];
ll p[maxn],pos[maxm][26];
ll read(){
ll x=0,y=0;
char ch=getchar();
while (ch<'0' || ch>'9'){
ch=getchar();
if (++y==10) return -1;
}
while (ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();
return x;
}
ll qpower(ll a,ll b){
ll c=1;
while (b){
if (b&1) c=c*a%mo;
a=a*a%mo;
b>>=1;
}
return c;
}
bool prepare(){
memset(f,0,sizeof(f));
memset(a,0,sizeof(a));
scanf("%s",a+1);
m=strlen(a+1);
if (a[1]<'a' || a[1]>'z'){
ans=qpower(26,n);
writeln(ans);
n=0;
for (i=1;i<=m;i++) n=n*10+a[i]-'0';
return false;
}else return true;
}
void kmp(){
j=0;
for (i=2;i<=m;i++){
while (j && a[j+1]!=a[i]) j=p[j];
if (a[j+1]==a[i]) j++;
p[i]=j;
}
for (i=0;i<m;i++)
for (j='a';j<='z';j++){
k=i;
while (k && a[k+1]!=j) k=p[k];
if (a[k+1]==j) pos[i][j-'a']=k+1;
else pos[i][j-'a']=0;
}
}
int main(){
freopen(fin,"r",stdin);
freopen(fout,"w",stdout);
n=0;
while (1){
if (!n) n=read();
if (n==-1) break;
if (prepare()){
kmp();
f[0][0]=1;
for (i=0;i<n;i++)
for (j=0;j<m;j++)
for (k=0;k<26;k++){
f[i+1][pos[j][k]]=(f[i+1][pos[j][k]]+f[i][j])%mo;
}
ans=0;
for (i=0;i<m;i++) ans=(ans+f[n][i])%mo;
writeln(ans);
n=0;
}
}
return 0;
}

【JZOJ4886】【NOIP2016提高A组集训第13场11.11】字符串的更多相关文章

  1. 【NOIP2016提高A组集训第13场11.11】最大匹配

    题目 mhy12345学习了二分图匹配,二分图是一种特殊的图,其中的点可以分到两个集合中,使得相同的集合中的点两两没有连边. 图的"匹配"是指这个图的一个边集,里面的边两两不存在公 ...

  2. 【JZOJ4887】【NOIP2016提高A组集训第13场11.11】最大匹配

    题目描述 mhy12345学习了二分图匹配,二分图是一种特殊的图,其中的点可以分到两个集合中,使得相同的集合中的点两两没有连边. 图的"匹配"是指这个图的一个边集,里面的边两两不存 ...

  3. JZOJ 【NOIP2016提高A组集训第16场11.15】兔子

    JZOJ [NOIP2016提高A组集训第16场11.15]兔子 题目 Description 在一片草原上有N个兔子窝,每个窝里住着一只兔子,有M条路径连接这些窝.更特殊地是,至多只有一个兔子窝有3 ...

  4. JZOJ 【NOIP2016提高A组集训第16场11.15】SJR的直线

    JZOJ [NOIP2016提高A组集训第16场11.15]SJR的直线 题目 Description Input Output Sample Input 6 0 1 0 -5 3 0 -5 -2 2 ...

  5. 【JZOJ4824】【NOIP2016提高A组集训第1场10.29】配对游戏

    题目描述 流行的跳棋游戏是在一个有m*n个方格的长方形棋盘上玩的.棋盘起初全部被动物或障碍物占满了.在一个方格中,'X'表示一个障碍物,一个'0'-'9'的个位数字表示一个不同种类的动物,相同的个位数 ...

  6. 【NOIP2016提高A组集训第4场11.1】平衡的子集

    题目 夏令营有N个人,每个人的力气为M(i).请大家从这N个人中选出若干人,如果这些人可以分成两组且两组力气之和完全相等,则称为一个合法的选法,问有多少种合法的选法? 分析 如果暴力枚举每个人被分到哪 ...

  7. 【JZOJ4841】【NOIP2016提高A组集训第4场11.1】平衡的子集

    题目描述 夏令营有N个人,每个人的力气为M(i).请大家从这N个人中选出若干人,如果这些人可以分成两组且两组力气之和完全相等,则称为一个合法的选法,问有多少种合法的选法? 数据范围 40%的数据满足: ...

  8. 【JZOJ4833】【NOIP2016提高A组集训第3场10.31】Mahjong

    题目描述 解法 搜索. 代码 #include<stdio.h> #include<iostream> #include<string.h> #include< ...

  9. 【NOIP2016提高A组集训第14场11.12】随机游走

    题目 YJC最近在学习图的有关知识.今天,他遇到了这么一个概念:随机游走.随机游走指每次从相邻的点中随机选一个走过去,重复这样的过程若干次.YJC很聪明,他很快就学会了怎么跑随机游走.为了检验自己是不 ...

随机推荐

  1. line-height:2和line-height:2em的区别,它们是有区别的

    line-height:2是2倍的意思,如果内部有不同大小文字的情况下,以最大文字为倍数. line-height:2em也是2倍文字大小的意思,但如果内部有大文字,它还是会以父容 器的大小来计算. ...

  2. 微端 打包更新工具 as air 分享

    分享 微端,更新的是散包,不像端游,一个大包搞定. 更新须要每次用工具把资源的散文件.依据文件夹结构及时间 生成一个列表, 每次更新就是 文件夹及时间的比对! 该project能够翻译成 其它语言.有 ...

  3. 2019-8-31-dotnet-新项目格式与对应框架预定义的宏

    title author date CreateTime categories dotnet 新项目格式与对应框架预定义的宏 lindexi 2019-08-31 16:55:58 +0800 201 ...

  4. Leetcode448.Find All Numbers Disappeared in an Array找到所有数组中消失的数字

    给定一个范围在  1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次. 找到所有在 [1, n] 范围之间没有出现在数组中的数字. 您能在不 ...

  5. bzoj 3110 [Zjoi2013]K大数查询——线段树套线段树(标记永久化)

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3110 第一道线段树套线段树! 第一道标记永久化! 为什么为什么写了两个半小时啊…… 本想线段 ...

  6. HTML5中的数据集dataset和自定义属性data-*

    在html5中可为所有元素添加一种自定义的属性,这种属性的前缀以data-开头,比如:data-name,目的是为元素提供与页面渲染无关,但与dom元素强相关的属性.添加完自定义属性后我们可以通过元素 ...

  7. 状态压缩中常用的位运算(DP)

    面对位运算,一直很无感...可能数学太差,脑洞太小. 1.首先是最基本的: 与&,或|,非~,异或^. 2.获取一个或者多个固定位的值: 假设 x = 1010(二进制),我们要取左数第二位的 ...

  8. VMware 安装 ubuntu 后安装 VMWare tools

    1.如果 VMware 的安装 VMWare tools 的菜单是灰色, 很可能原因是:    你的 cdrom 被占用着. 关闭系统, 编辑配置, 把cdrom 改为 自动检测. 即不要开始就加载一 ...

  9. jeecms 基本架构研究

    最近工作需要内容管理系统,下载了jeecms v5 顺便学习一下它的架构: 采用框架为:Hibernate3.3.2+spring3.05+springMVC+freemarker2.3.16 Hib ...

  10. 访问者模式(Visitor、Element、accept、ObjectStructure、)(操作外置,与数据结构分离)

    访问者模式表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作.从定义可以看出结构对象是使用访问者模式的必备条件,而且这个结构对象必须存在遍历自身各个 ...