Growing Strings

题目:给出n个字符串,问最多能够选出多少个串组成序列,并满足前一个字符串是后一个字符串的子串。

分析:

  AC自动机经典水题。。。
  考虑每个节点结尾时,他能够选出最多的串 = max{ 父节点选出  , fail节点选出 }+以该节点为结尾的单词个数

  1. #include <set>
  2. #include <map>
  3. #include <list>
  4. #include <cmath>
  5. #include <queue>
  6. #include <stack>
  7. #include <string>
  8. #include <vector>
  9. #include <cstdio>
  10. #include <cstring>
  11. #include <complex>
  12. #include <iostream>
  13. #include <algorithm>
  14.  
  15. using namespace std;
  16.  
  17. typedef long long ll;
  18. typedef unsigned long long ull;
  19.  
  20. #define debug puts("here")
  21. #define rep(i,n) for(int i=0;i<n;i++)
  22. #define rep1(i,n) for(int i=1;i<=n;i++)
  23. #define REP(i,a,b) for(int i=a;i<=b;i++)
  24. #define foreach(i,vec) for(unsigned i=0;i<vec.size();i++)
  25. #define pb push_back
  26. #define RD(n) scanf("%d",&n)
  27. #define RD2(x,y) scanf("%d%d",&x,&y)
  28. #define RD3(x,y,z) scanf("%d%d%d",&x,&y,&z)
  29. #define RD4(x,y,z,w) scanf("%d%d%d%d",&x,&y,&z,&w)
  30. #define All(vec) vec.begin(),vec.end()
  31. #define MP make_pair
  32. #define PII pair<int,int>
  33. #define PQ priority_queue
  34. #define cmax(x,y) x = max(x,y)
  35. #define cmin(x,y) x = min(x,y)
  36. #define Clear(x) memset(x,0,sizeof(x))
  37. #define lson rt<<1
  38. #define rson rt<<1|1
  39. #define SZ(x) x.size()
  40.  
  41. /*
  42.  
  43. #pragma comment(linker, "/STACK:1024000000,1024000000")
  44.  
  45. int ssize = 256 << 20; // 256MB
  46. char *ppp = (char*)malloc(ssize) + ssize;
  47. __asm__("movl %0, %%esp\n" :: "r"(ppp) );
  48.  
  49. */
  50.  
  51. char IN;
  52. bool NEG;
  53. inline void Int(int &x){
  54. NEG = 0;
  55. while(!isdigit(IN=getchar()))
  56. if(IN=='-')NEG = 1;
  57. x = IN-'0';
  58. while(isdigit(IN=getchar()))
  59. x = x*10+IN-'0';
  60. if(NEG)x = -x;
  61. }
  62. inline void LL(ll &x){
  63. NEG = 0;
  64. while(!isdigit(IN=getchar()))
  65. if(IN=='-')NEG = 1;
  66. x = IN-'0';
  67. while(isdigit(IN=getchar()))
  68. x = x*10+IN-'0';
  69. if(NEG)x = -x;
  70. }
  71.  
  72. /******** program ********************/
  73.  
  74. const int MAXN = 1e6+5;
  75. const int kind = 26;
  76.  
  77. char s[MAXN];
  78.  
  79. struct AC{
  80.  
  81. int dp[MAXN];
  82. int ch[MAXN][kind],fail[MAXN];
  83. int end[MAXN];
  84. int tot;
  85.  
  86. inline void set(int x){
  87. Clear(ch[x]);
  88. fail[x] = end[x] = dp[x] = 0;
  89. }
  90. inline void init(){
  91. set(tot = 1);
  92. }
  93. inline int newNode(){
  94. set(++tot);
  95. return tot;
  96. }
  97. inline int ind(char c){
  98. return c-'a';
  99. }
  100.  
  101. inline void ins(){
  102. int r = 1;
  103. for(int i=0;s[i];i++){
  104. int c = ind(s[i]);
  105. if(ch[r][c]==0)
  106. ch[r][c] = newNode();
  107. r = ch[r][c];
  108. }
  109. ++end[r];
  110. }
  111.  
  112. inline void build(){
  113. queue<int> q;
  114. q.push(1);
  115. while(!q.empty()){
  116. int r = q.front();
  117. q.pop();
  118. rep(c,kind){
  119. int x = ch[r][c];
  120. if(!x)continue;
  121. q.push(x);
  122. int y = fail[r];
  123. while(y&&ch[y][c]==0)
  124. y = fail[y];
  125. fail[x] = y?ch[y][c]:1;
  126. dp[x] = max( dp[r],dp[ fail[x] ] )+end[x];
  127. }
  128. }
  129. cout<<*max_element(dp+1,dp+tot+1)<<endl;
  130. }
  131.  
  132. inline void run(){
  133. int n;
  134. while(RD(n),n){
  135. init();
  136. getchar();
  137. rep(i,n){
  138. gets(s);
  139. ins();
  140. }
  141. build();
  142. }
  143. }
  144. }ac;
  145.  
  146. int main(){
  147.  
  148. #ifndef ONLINE_JUDGE
  149. freopen("sum.in","r",stdin);
  150. //freopen("sum.out","w",stdout);
  151. #endif
  152.  
  153. ac.run();
  154.  
  155. return 0;
  156. }

  

SPOJ 7758. Growing Strings AC自动机DP的更多相关文章

  1. hdu 4117 GRE Words AC自动机DP

    题目:给出n个串,问最多能够选出多少个串,使得前面串是后面串的子串(按照输入顺序) 分析: 其实这题是这题SPOJ 7758. Growing Strings AC自动机DP的进阶版本,主题思想差不多 ...

  2. HDU 2425 DNA repair (AC自动机+DP)

    DNA repair Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  3. HDU 4758 Walk Through Squares (2013南京网络赛1011题,AC自动机+DP)

    Walk Through Squares Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Oth ...

  4. POJ1625 Censored!(AC自动机+DP)

    题目问长度m不包含一些不文明单词的字符串有多少个. 依然是水水的AC自动机+DP..做完后发现居然和POJ2778是一道题,回过头来看都水水的... dp[i][j]表示长度i(在自动机转移i步)且后 ...

  5. HDU2296 Ring(AC自动机+DP)

    题目是给几个带有价值的单词.而一个字符串的价值是 各单词在它里面出现次数*单词价值 的和,问长度不超过n的最大价值的字符串是什么? 依然是入门的AC自动机+DP题..不一样的是这题要输出具体方案,加个 ...

  6. HDU2457 DNA repair(AC自动机+DP)

    题目一串DNA最少需要修改几个基因使其不包含一些致病DNA片段. 这道题应该是AC自动机+DP的入门题了,有POJ2778基础不难写出来. dp[i][j]表示原DNA前i位(在AC自动机上转移i步) ...

  7. hdu 2457(ac自动机+dp)

    题意:容易理解... 分析:这是一道比较简单的ac自动机+dp的题了,直接上代码. 代码实现: #include<stdio.h> #include<string.h> #in ...

  8. HDU2296——Ring(AC自动机+DP)

    题意:输入N代表字符串长度,输入M代表喜欢的词语的个数,接下来是M个词语,然后是M个词语每个的价值.求字符串的最大价值.每个单词的价值就是单价*出现次数.单词可以重叠.如果不止一个答案,选择字典序最小 ...

  9. tyvj P1519 博彩游戏(AC自动机+DP滚动数组)

    P1519 博彩游戏 背景 Bob最近迷上了一个博彩游戏…… 描述 这个游戏的规则是这样的:每花一块钱可以得到一个随机数R,花上N块钱就可以得到一个随机序列:有M个序列,如果某个序列是产生的随机序列的 ...

随机推荐

  1. WCF WEB API配置

    Web.config配置 <system.serviceModel> <services> <service name="WCFServiceWebRole2. ...

  2. DataTable添加行和列

    tablenullobjectdatasetc#c 手动插入一行数据 DataSet ds = tTalent.GetAllInfo();         DataRow dr = ds.Tables ...

  3. $( document ).ready()&$(window).load()

    $( document ).ready() https://learn.jquery.com/using-jquery-core/document-ready/ A page can't be man ...

  4. as3.0:文字 效果

    //文字描边效果var tf1 = _root.createTextField("tf1", _root.getNextHighestDepth(), 10, 10, 0, 0); ...

  5. pycharm快捷键大全

    Python IDE PyCharm的快捷键大全1.编辑(Editing)Ctrl + Space 基本的代码完成(类.方法.属性)Ctrl + Alt + Space 快速导入任意类Ctrl + S ...

  6. Java常见排序算法之归并排序

    在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...

  7. 广州项目实施步骤I_练习安装 CentOS x64 6.4

    安装Centos x64 6.4 在家里使用 Vmware10.0.1进行模拟安装. 永久KEY注册密钥:5F29M-48312-8ZDF9-A8A5K-2AM0Z  下载地址:http://pan. ...

  8. JQueryMobile页面跳转参数的传递解决方案

    在JQueryMobile开发手机端应用使用可能需要考虑相关的页面跳转带来的参数问题.因为JQueryMobile其实也是HTML5实践的结果.HTML5中有localStorage和sessionS ...

  9. [Node.js] Broswerify -- 2

    Browserify allows you to leverage 10s of thousands of javascript modules available in the Node Packa ...

  10. Ubuntu:Target filesystem doesn&#39;t have /sbin/init (Slax 解决)

    计算机(Ubuntu)因为异常断电或是其它原因,再次启动时.非常不幸的出现: Killed mount: mounting /dev on /root/dev failed: No such file ...