什么鬼,真的是有负数的吗?我在字符加上了128才过了。dp[i][j],经过i步到达j状态的路径数。转移很容易了,建个trie图就可以,由前一步可连通到和更新即可。

另外,要用到大数和AC自动机DP

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. #include <climits>
  6. #include <string.h>
  7. #include <queue>
  8. #include <cmath>
  9. #include <map>
  10. #include <vector>
  11. #define LL __int64
  12. using namespace std;
  13.  
  14. const __int64 forward=100000000000000000LL;
  15. const int root=;
  16. const int Maxn=;
  17. int idx[];
  18. struct BigNumber{
  19. LL num[];
  20. void initial(){
  21. for(int i=;i<;i++)
  22. num[i]=;
  23. }
  24. };
  25. BigNumber add_BigNumber(BigNumber a,BigNumber b){
  26. BigNumber c;
  27. c.initial();
  28. for(int i=;i<;i++){
  29. c.num[i]=c.num[i]+a.num[i]+b.num[i];
  30. c.num[i+]=c.num[i]/forward;
  31. c.num[i]%=forward;
  32. }
  33. return c;
  34. }
  35. BigNumber dp[][];
  36. struct Node{
  37. bool tag;
  38. int next[];
  39. int fail;
  40. void initial(){
  41. tag=false;
  42. memset(next,-,sizeof(next));
  43. fail=-;
  44. }
  45. };
  46. int que[Maxn],head,tail,tot;
  47. Node trie[Maxn];
  48. int dictsize,step;
  49. char str[];
  50.  
  51. void build_ac(){
  52. head=tail=;
  53. que[tail++]=root;
  54. int tmp,p;
  55. while(head!=tail){
  56. tmp=que[head++];
  57. p=-;
  58. for(int i=;i<dictsize;i++){
  59. if(trie[tmp].next[i]!=-){
  60. if(tmp==root) trie[trie[tmp].next[i]].fail=root;
  61. else{
  62. p=trie[tmp].fail;
  63. while(p!=-){
  64. if(trie[p].next[i]!=-){
  65. trie[trie[tmp].next[i]].fail=trie[p].next[i];
  66. break;
  67. }
  68. p=trie[p].fail;
  69. }
  70. if(p==-) trie[trie[tmp].next[i]].fail=root;
  71. }
  72. if(trie[trie[trie[tmp].next[i]].fail].tag)
  73. trie[trie[tmp].next[i]].tag=true;
  74. que[tail++]=trie[tmp].next[i];
  75. }
  76. else{ //trie[tmp].next[i]==-1
  77. if(tmp==root) trie[tmp].next[i]=root;
  78. else{
  79. p=trie[tmp].fail;
  80. while(p!=-){
  81. if(trie[p].next[i]!=-){
  82. trie[tmp].next[i]=trie[p].next[i];
  83. break;
  84. }
  85. p=trie[p].fail;
  86. }
  87. if(p==-) trie[tmp].next[i]=root;
  88. }
  89. }
  90. }
  91. }
  92. }
  93.  
  94. int main(){
  95. int n,m,p,pt;
  96. cin>>n>>m>>p;
  97. for(int i=;i<Maxn;i++) trie[i].initial();
  98. head=tail=tot=;
  99. dictsize=n; step=m;
  100. cin>>str;
  101. for(int i=;i<n;i++)
  102. idx[str[i]+]=i;
  103. // cout<<idx['a']<<endl;
  104. // cout<<idx['b']<<endl;
  105. for(int i=;i<p;i++){
  106. cin>>str;
  107. pt=root;int k=;
  108. int len=strlen(str);
  109. while(k<len){
  110. if(trie[pt].next[idx[str[k]+]]==-) trie[pt].next[idx[str[k]+]]=++tot;
  111. pt=trie[pt].next[idx[str[k]+]];
  112. k++;
  113. }
  114. trie[pt].tag=true;
  115. }
  116. // cout<<"YES"<<endl;
  117. build_ac();
  118. // cout<<"YEA"<<endl;
  119. for(int i=;i<=tot;i++){
  120. for(int j=;j<=step;j++)
  121. dp[i][j].initial();
  122. }
  123. dp[][].num[]=;
  124. for(int k=;k<step;k++){
  125. for(int i=;i<=tot;i++){
  126. if(!trie[i].tag){
  127. for(int j=;j<dictsize;j++){
  128. if(!trie[trie[i].next[j]].tag)
  129. dp[trie[i].next[j]][k+]=add_BigNumber(dp[trie[i].next[j]][k+],dp[i][k]);
  130. }
  131. }
  132. }
  133. }
  134. BigNumber ans;
  135. ans.initial();
  136. // cout<<tot<<endl;
  137. for(int i=;i<=tot;i++){
  138. if(!trie[i].tag){
  139. ans=add_BigNumber(ans,dp[i][step]);
  140. }
  141. }
  142. bool flag=false;
  143. for(int i=;i>=;i--)
  144. if(ans.num[i]>||flag){
  145. if(flag)
  146. printf("%017I64d",ans.num[i]);
  147. else
  148. printf("%I64d",ans.num[i]);
  149. flag=true;
  150. }
  151. if(flag)
  152. printf("%017I64d\n",ans.num[]);
  153. else{
  154. printf("%I64d\n",ans.num[]);
  155. }
  156. return ;
  157. }

POJ 1625的更多相关文章

  1. POJ 1625 Censored!(AC自动机+高精度+dp)

    http://poj.org/problem?id=1625 题意: 给出一些单词,求长度为m的串不包含这些单词的个数. 思路: 这道题和HDU 2243和POJ 2778是一样的,不同的是这道题不取 ...

  2. POJ 1625 Censored!(AC自动机+DP+高精度)

    Censored! Time Limit: 5000MS   Memory Limit: 10000K Total Submissions: 6956   Accepted: 1887 Descrip ...

  3. POJ 1625 Censored ( Trie图 && DP && 高精度 )

    题意 : 给出 n 个单词组成的字符集 以及 p 个非法串,问你用字符集里面的单词构造长度为 m 的单词的方案数有多少种? 分析 :先构造出 Trie 图方便进行状态转移,这与在 POJ 2278 中 ...

  4. Match:Censored!(AC自动机+DP+高精度)(POJ 1625)

     Censored! 题目大意:给定一些字符,将这些字符组成一个固定长度的字符串,但是字符串不能包含一些禁词,问你有多少种组合方式. 这是一道好题,既然出现了“一些”禁词,那么这题肯定和AC自动机有点 ...

  5. POJ 1625 Censored!

    辣鸡OI毁我青春 Description The alphabet of Freeland consists of exactly N letters. Each sentence of Freela ...

  6. poj 1625 (AC自动机好模版,大数好模版)

    题目 给n个字母,构成长度为m的串,总共有n^m种.给p个字符串,问n^m种字符串中不包含(不是子串)这p个字符串的个数. 将p个不能包含的字符串建立AC自动机,每个结点用val值来标记以当前节点为后 ...

  7. POJ 1625 Censored!(大数+DP)

    题目链接 这题,真心木啥意思,就是数据里貌似字符有负数,注意gets读入.. #include <iostream> #include <cstring> #include & ...

  8. Censored! - POJ 1625(ac自动机+简单dp+高精度运算)

    题目大意:首先给一个字符集合,这个集合有N个字符,然后需要一个长度为M的句子,但是据子里面不能包含的串有P个,每个串里面的字符都是有字符集和里面的字符构成的,现在想知道最多能构造多少个不重复的句子. ...

  9. POJ 1625 Censored! [AC自动机 高精度]

    Censored! Time Limit: 5000MS   Memory Limit: 10000K Total Submissions: 9793   Accepted: 2686 Descrip ...

  10. POJ 1625 Censored!(AC自动机->指针版+DP+大数)题解

    题目:给你n个字母,p个模式串,要你写一个长度为m的串,要求这个串不能包含模式串,问你这样的串最多能写几个 思路:dp+AC自动机应该能看出来,万万没想到这题还要加大数...orz 状态转移方程dp[ ...

随机推荐

  1. 复习--二叉树&&树

    树是一种很常用的数据结构,日后的学习中会经常碰到运用树的知识. //构造二叉树#include<cstdio> #include<iostream> #include<a ...

  2. DCloud-MUI:下拉刷新、上拉加载

    ylbtech-DCloud-MUI:下拉刷新.上拉加载 1. 下拉刷新返回顶部 0. http://dev.dcloud.net.cn/mui/pulldown/ 1. 概述 为实现下拉刷新功能,大 ...

  3. openstack 性能优化极致

  4. python-day3 元组(tuple),列表(list),字典(dict)

    1.元组 tuple 有序数据,元组数据不可更改,若元组中有列表,可更改元组中的列表值里的值 元组中以","分开,若只有一个值就不是元组 包含各种数据类型 索引取值:t(2,0.0 ...

  5. RabbitMQ 官方NET教程(六)【RPC】

    在第二个教程中,我们学习了如何使用Work Queues在多个工作者之间分配耗时的任务. 但是如果我们需要在远程计算机上运行功能并等待结果怎么办? 那是一个不同的模式. 此模式通常称为远程过程调用或R ...

  6. Go中的main函数和init函数

    Go里面有两个保留的函数:init函数(能够应用于所有的package)和main函数(只能应用于package main).这两个函数在定义时不能有任何的参数和返回值.虽然一个package里面可以 ...

  7. 运用<body>属性,渲染页面效果

    新建一个HTML5文件,为<body>标签添加样式,代码如下: 01 <!doctype html> 02 <html> 03 <head> 04 &l ...

  8. C#多线程方法 可传参

    //将线程执行的方法和参数都封装到一个类里面.通过实例化该类,方法就可以调用属性来实现间接的类型安全地传递参数.using System; using System.Threading; //Thre ...

  9. jQuery顺序加载图片(终版)

    这一篇是对上一篇(jQuery顺序加载图片(初版)--http://www.cnblogs.com/newbie-cc/p/3707504.html)的改进. function loadImage(i ...

  10. HDU_5724_状态压缩的sg函数

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5724 题目大意:n行20列的棋盘,对于每行,如果当前棋子右边没棋子,那可以直接放到右边,如果有就跳过放 ...