题目描述

某日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得出。

代码

  1. #include<iostream>
  2. #include<stdio.h>
  3. #include<string.h>
  4. #include<math.h>
  5. #include<algorithm>
  6. #define write(x) (cout<<(x)<<" ")
  7. #define writeln(x) (cout<<(x)<<endl)
  8. #define ll long long
  9. using namespace std;
  10. const char* fin="helloworld.in";
  11. const char* fout="helloworld.out";
  12. const ll inf=0x7fffffff;
  13. const ll maxn=10007,maxm=107,mo=1000000007;
  14. ll n,m,i,j,k,ans;
  15. char a[maxm];
  16. ll f[maxn][maxm];
  17. ll p[maxn],pos[maxm][26];
  18. ll read(){
  19. ll x=0,y=0;
  20. char ch=getchar();
  21. while (ch<'0' || ch>'9'){
  22. ch=getchar();
  23. if (++y==10) return -1;
  24. }
  25. while (ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();
  26. return x;
  27. }
  28. ll qpower(ll a,ll b){
  29. ll c=1;
  30. while (b){
  31. if (b&1) c=c*a%mo;
  32. a=a*a%mo;
  33. b>>=1;
  34. }
  35. return c;
  36. }
  37. bool prepare(){
  38. memset(f,0,sizeof(f));
  39. memset(a,0,sizeof(a));
  40. scanf("%s",a+1);
  41. m=strlen(a+1);
  42. if (a[1]<'a' || a[1]>'z'){
  43. ans=qpower(26,n);
  44. writeln(ans);
  45. n=0;
  46. for (i=1;i<=m;i++) n=n*10+a[i]-'0';
  47. return false;
  48. }else return true;
  49. }
  50. void kmp(){
  51. j=0;
  52. for (i=2;i<=m;i++){
  53. while (j && a[j+1]!=a[i]) j=p[j];
  54. if (a[j+1]==a[i]) j++;
  55. p[i]=j;
  56. }
  57. for (i=0;i<m;i++)
  58. for (j='a';j<='z';j++){
  59. k=i;
  60. while (k && a[k+1]!=j) k=p[k];
  61. if (a[k+1]==j) pos[i][j-'a']=k+1;
  62. else pos[i][j-'a']=0;
  63. }
  64. }
  65. int main(){
  66. freopen(fin,"r",stdin);
  67. freopen(fout,"w",stdout);
  68. n=0;
  69. while (1){
  70. if (!n) n=read();
  71. if (n==-1) break;
  72. if (prepare()){
  73. kmp();
  74. f[0][0]=1;
  75. for (i=0;i<n;i++)
  76. for (j=0;j<m;j++)
  77. for (k=0;k<26;k++){
  78. f[i+1][pos[j][k]]=(f[i+1][pos[j][k]]+f[i][j])%mo;
  79. }
  80. ans=0;
  81. for (i=0;i<m;i++) ans=(ans+f[n][i])%mo;
  82. writeln(ans);
  83. n=0;
  84. }
  85. }
  86. return 0;
  87. }

【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. C#获取C# DLL中的指定接口的所有实现实例 - qq_19759475的博客 - CSDN博客

    原文:C#获取C# DLL中的指定接口的所有实现实例 - qq_19759475的博客 - CSDN博客 public static List<T> CreateTarInterface& ...

  2. Linq处理list数据

    获取数据列表. //获取数据列表,Model是类 IList<Model> list = dao.getmx(Model, pageInfo);//DataTable数据DataTable ...

  3. MySQL与Oracle差异函数对比

    ORACLE:select round(1.23456,4) value from dual MYSQL:select round(1.23456,4) value 2 abs(-1) abs(-1) ...

  4. 【python之路面向对象】初级篇

    概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发“更快更好更强...” 面向过程编程最易被初学 ...

  5. Django项目:CRM(客户关系管理系统)--32--24PerfectCRM实现King_admin自定义操作数据

    #admin.py # ————————01PerfectCRM基本配置ADMIN———————— from django.contrib import admin # Register your m ...

  6. ES6学习笔记之块级作用域

    ES6学习笔记:块级作用域 作用域分类 全局作用域 局部作用域 块级作用域 全局作用域示例 var i=2; for (var i = 0; i < 10; i++) { } console.l ...

  7. Tr A HDU 1575 (矩阵快速幂)

    #include<iostream> #include<vector> #include<string> #include<cmath> #includ ...

  8. MVC的学习步骤

    (1)搭建环境(2)如何完成Controller和 Model的映射(3)如何把值传给Controller(4)Controller如何把值传给viewer(5)异常处理(6)页面标签(7)文件上传( ...

  9. Lab1 ex1 物理页内存分配算法的实现

    调用流程如下 kern_init --> pmm_init-->page_init-->init_memmap--> pmm_manager->init_memmap 从 ...

  10. JSP-request(httpServletRequest)

    HttpServletRequest 1 HttpServletRequest概述 2 request运行流程 3 通过抓包工具抓的http请求 4 请求行信息的相关方法 //1.获得请求方式 Str ...