标题效果:给定词的列表,并m串 每个字符串q个最长前缀,这个前缀可满足拆分成一些字符串 这些字符串中存在的词汇太

再也不怕错误的数据范围……有一个很明显Trie树能解决的问题竟然被我写的AC自己主动机……

单词列表插入所有字AC主动机 每一个单词所在的节点记录这个单词的长度

然后对于每一个字符串 用f[i]表示长度为i的前缀能否拆分成单词表中的单词 跑AC自己主动机

对于每一个匹配的节点 从这个节点開始到根的fail路径上的全部len f[i]|=f[i-len]

找到最大的为1的f[i]即是答案

因为单词长度最大为10 所以直接用Trie树暴力就可以

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. #include <algorithm>
  5. #define M 1050000
  6. using namespace std;
  7. struct Trie{
  8. int len;
  9. Trie *fail,*son[26];
  10. void* operator new (size_t size);
  11. }*root,*mempool,*C;
  12. int n,m;
  13. char s[M];
  14. void* Trie :: operator new (size_t size)
  15. {
  16. if(C==mempool)
  17. {
  18. C=new Trie[1<<15];
  19. mempool=C+(1<<15);
  20. memset(C,0,sizeof(Trie)*(1<<15) );
  21. }
  22. return C++;
  23. }
  24. void Insert(Trie*&p,char *pos,int dpt)
  25. {
  26. if(!p) p=new Trie;
  27. if(!*pos)
  28. {
  29. p->len=dpt;
  30. return ;
  31. }
  32. Insert(p->son[(*pos)-'a'],pos+1,dpt+1);
  33. }
  34. void BFS()
  35. {
  36. static Trie* q[1<<16];
  37. static unsigned short r,h;
  38. int i;Trie *temp;
  39. for(i=0;i<26;i++)
  40. if(temp=root->son[i])
  41. {
  42. temp->fail=root;
  43. q[++r]=temp;
  44. }
  45. while(r!=h)
  46. {
  47. Trie *p=q[++h];
  48. for(i=0;i<26;i++)
  49. if(p->son[i])
  50. {
  51. temp=p->fail;
  52. while( temp!=root && !temp->son[i] )
  53. temp=temp->fail;
  54. if( temp->son[i] )
  55. temp=temp->son[i];
  56. p->son[i]->fail=temp;
  57. q[++r]=p->son[i];
  58. }
  59. }
  60. }
  61. int Aho_Corasick_Automaton()
  62. {
  63. int i,re=0;
  64. Trie *p=root,*temp;
  65. static bool f[M];f[0]=1;
  66. for(i=1;s[i];i++)
  67. {
  68. f[i]=0;
  69. while( p!=root && !p->son[s[i]-'a'] )
  70. p=p->fail;
  71. if(p->son[s[i]-'a'])
  72. {
  73. p=p->son[s[i]-'a'];
  74. for(temp=p;temp!=root;temp=temp->fail)
  75. if(temp->len)
  76. {
  77. f[i]|=f[i-temp->len];
  78. if(f[i]) break;
  79. }
  80. }
  81. if(f[i]) re=i;
  82. }
  83. return re;
  84. }
  85. int main()
  86. {
  87. int i;
  88. cin>>n>>m;
  89. for(i=1;i<=n;i++)
  90. scanf("%s",s+1),Insert(root,s+1,0);
  91. BFS();
  92. for(i=1;i<=m;i++)
  93. {
  94. scanf("%s",s+1);
  95. cout<<Aho_Corasick_Automaton()<<endl;
  96. }
  97. }

版权声明:本文博客原创文章,博客,未经同意,不得转载。

BZOJ 1212 HNOI2004 L语言 AC自己主动机(Trie树)+动态规划的更多相关文章

  1. BZOJ 1212: [HNOI2004]L语言 [AC自动机 DP]

    1212: [HNOI2004]L语言 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1367  Solved: 598[Submit][Status ...

  2. bzoj 1212: [HNOI2004]L语言 AC自动机+状压

    为什么这道题网上所有题解写的都是N*Len的trie树的暴力啊,4E的复杂度... 为什么暴力还跑这么快啊TAT.. 有一个O(Len)的做法就是先把AC自动机建出来,因为每个字典串的长度很小,所以我 ...

  3. BZOJ 1212: [HNOI2004]L语言( dp + trie )

    因为单词很短...用trie然后每次dp暴力查找...用哈希+dp应该也是可以的.... ------------------------------------------------------- ...

  4. BZOJ 1212 [HNOI2004]L语言 【AC自动机 + 背包】

    题目链接[http://www.lydsy.com/JudgeOnline/problem.php?id=1212] 题意:给你一些单词,然后给出一个没有标点的文本串S,都是小写字符.现在让你求用给出 ...

  5. bzoj 1212: [HNOI2004]L语言

    思路:字典树+dp, dp[ i ] 表示 前缀到 i 能不能被理解, 如果dp[ i ] 是能被理解的那么, 把i + 1, i + 2 ....  在字典树上走,走到一个单词就转移. ,这样可行的 ...

  6. BZOJ 1212: [HNOI2004]L语言 trie

    长度小于 10 是关键信息~ #include <cstdio> #include <cstring> #include <algorithm> #define N ...

  7. 1212: [HNOI2004]L语言

    1212: [HNOI2004]L语言 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 643  Solved: 252[Submit][Status] ...

  8. BZOJ 3172 [Tjoi2013]单词 AC自己主动机(fail树)

    题意:链接 方法:AC自己主动机与fail树性质 解析:复习AC自己主动机的第一道题?(真正的第一题明明是又一次写了遍hdu2222! ) 这题说实话第一眼看上去就是个sb题,仅仅要建出来自己主动机. ...

  9. BZOJ P1212 [HNOI2004] L语言

    标点符号的出现晚于文字的出现,所以以前的语言都是没有标点的.现在你要处理的就是一段没有标点的文章. 一段文章T是由若干小写字母构成.一个单词W也是由若干小写字母构成.一个字典D是若干个单词的集合. 我 ...

随机推荐

  1. fragment android

    在Eoe中看到了 一个关于的 详细讲解,相信对 学Fragment 有帮助 android fragment基础与源码案例: Fragment动画效果 http://www.eoeandroid.co ...

  2. eclipse luna 无法安装veloeclipse问题

    问题: 在eclipse 4.4(luna)版本号.安装veloeclipse 2.0.8时,在即将完毕的时候出现下面错误提示: An error occurred while installing ...

  3. lunix shell 基础经常使用整理

     1   ps  -ef    显示正在执行的进程,pid 等信息  UID PID PPID C STIME TTY TIME CMD root 1 0 0 03:45 ? 00:00:02 ini ...

  4. 2014在辛星Javascript口译科

    ***************概要*************** 1.Javascript是一种原型化继承的基于对象的动态类型的脚本语言,它区分大写和小写.主要执行在client,用户即使响应用户的操 ...

  5. IOS_多线程_ASI_AFN_UIWebView

    H:/0730/00_多线程4票种_ViewController.h // // ViewController.h // 卖票 // // Created by apple on 13-7-29. / ...

  6. Android.mk参数解释

    -------------------- 下面对Android.mk 中经常出现的变量进行讲解 -------------------- 这些变量,你会经常在Android.mk文件中见到,下面以字表 ...

  7. 重新想象 Windows 8 Store Apps (20) - 动画: ThemeAnimation(主题动画)

    原文:重新想象 Windows 8 Store Apps (20) - 动画: ThemeAnimation(主题动画) [源码下载] 重新想象 Windows 8 Store Apps (20) - ...

  8. telnet模拟http訪问

    HTTP协议经常使用的无非就那么几个命令 GET HEAD PUT POST 此处简单说下http的GET和HEAD 举两个简单的样例: GET的样例 telnet serverip 80 GET h ...

  9. JAVA IP地址转成长整型方法

    JAVA IP地址转成长整型方法 代码例如以下: /** * IP转成整型 * @param ip * @return */ public static Long ip2int(String ip) ...

  10. 点击搜索取消UISearchDisplayController的搜索状态

    一般,我们用到UISearchDisplayController的时候,都是须要对一个数据源进行刷选,在UISearchDisplayController自带的tableView中展示出来,然后点击退 ...