题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&category=282&page=show_problem&problem=1943

差点就被这个题目RE疯掉(ノへ ̄、)。

字典树:保存字符串集合。

用一个二维数组ch[i][j] 保存节点i,到标号j的叶子节点是否存在。一般val[i] 表示节点  i 对应的附加权值。

这个题目,给一个字典,一个文本,看文本可以有多少种分解方法。

用DP做,DP方程 dp[i] = sum(dp[i+len[x]]) ;   从后往前。

dp[i] 是从字符 i 开始的后缀数组的分解方案, x 是一个单词,是从 i 以后的单词

我RE的地方是ch数组用的char型,然后我一直查数组范围,LRJ的代码,我比照了好久O(≧口≦)O。

  1. #include<cstring>
  2. #include<vector>
  3.  
  4. using namespace std;
  5.  
  6. const int maxnode = *+;
  7. const int sigma_size = ;
  8.  
  9. struct Trie
  10. {
  11. int ch[maxnode][sigma_size];
  12. int val[maxnode];
  13. int sz; ///节点总数
  14. void clear()
  15. {
  16. sz = ;
  17. memset(ch[],,sizeof(ch[]));
  18. }
  19.  
  20. int idx(char c)
  21. {
  22. return c-'a';
  23. }
  24.  
  25. void insert(const char *s, int v)
  26. {
  27. int u = , n = strlen(s);
  28. for(int i = ; i < n; i++)
  29. {
  30. int c = idx(s[i]);
  31. if(!ch[u][c])
  32. {
  33. memset(ch[sz], , sizeof(ch[sz]));
  34. val[sz] = ;
  35. ch[u][c] = sz++;
  36. }
  37. u = ch[u][c];
  38. }
  39. val[u] = v;
  40. }
  41.  
  42. ///找字符串s不超过len的前缀
  43. void find_prefixes(const char *s, int len, vector<int>& ans)
  44. {
  45. int u = ;
  46. for(int i = ; i < len; i++)
  47. {
  48. if(s[i] == '\0') break;
  49. int c = idx(s[i]);
  50. if(!ch[u][c]) break;
  51. u = ch[u][c];
  52. if(val[u] != ) ans.push_back(val[u]); // 找到一个前缀
  53. }
  54. }
  55. };
  56.  
  57. #include<cstdio>
  58. const int maxl = +;
  59. const int maxw = +;
  60. const int maxwl = +;
  61. const int MOD = ;
  62.  
  63. int d[maxl],len[maxw];
  64. char text[maxl],word[maxwl];
  65. Trie trie;
  66.  
  67. int main()
  68. {
  69. //freopen("in.txt","r",stdin);
  70. int cases = ;
  71. int s;
  72. while(scanf("%s%d",text,&s)==)
  73. {
  74. trie.clear();
  75. for(int i=; i<=s; i++)
  76. {
  77. scanf("%s",word);
  78. len[i] = strlen(word);
  79. trie.insert(word,i);
  80. }
  81. memset(d,,sizeof(d));
  82. int L = strlen(text);
  83. d[L] = ;
  84. for(int i=L-; i>=; i--)
  85. {
  86. vector<int> p;
  87. trie.find_prefixes(text+i,L-i,p);
  88. for(int j=; j<p.size(); j++)
  89. {
  90. d[i] = (d[i]+d[i+len[p[j]]])%MOD;
  91. }
  92. }
  93. printf("Case %d: %d\n",cases++,d[]);
  94. }
  95. return ;
  96. }

2007 Asia - Nanjing F题,字典树的更多相关文章

  1. C#LeetCode刷题-字典树

    字典树篇 # 题名 刷题 通过率 难度 208 实现 Trie (前缀树)   48.6% 中等 211 添加与搜索单词 - 数据结构设计   39.9% 中等 212 单词搜索 II   27.9% ...

  2. HDU1305 Immediate Decodability(水题字典树)

    巧了,昨天刚刚写了个字典树,手到擒来,233. Problem Description An encoding of a set of symbols is said to be immediatel ...

  3. 2010辽宁省赛F(字典树,动态规划)

    #include<bits/stdc++.h>using namespace std;int n,x;char s[10010];char a[31010];int val[100010] ...

  4. HDU1671 水题字典树

    #include<cstdio> #include<cstdlib> #include<iostream> #include<cstring> #inc ...

  5. Good Firewall(字典树 HDU4760)

    Good Firewall Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...

  6. HDU 4757 Tree(可持久化字典树)(2013 ACM/ICPC Asia Regional Nanjing Online)

    Problem Description   Zero and One are good friends who always have fun with each other. This time, ...

  7. HDU-4825 Xor Sum,字典树好题!

    Xor Sum 一遍A了之后大呼一声好(keng)题!debug了两小时~~~~百度之星资格赛,可以. 题意:给你一个n个元素的数组,m次查询,每次输入一个数k要求从数组中找到一个数与k异或值最大,输 ...

  8. hdu 1251 统计难题 (字典树入门题)

    /******************************************************* 题目: 统计难题 (hdu 1251) 链接: http://acm.hdu.edu. ...

  9. Hihicoder 题目1 : Trie树(字典树,经典题)

    题目1 : Trie树 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编 ...

随机推荐

  1. new XMLHttpRequest()和页面关系

    1.  三个页面分别对应"自己“的异步对象(3个) <title></title> <script type="text/javascript&quo ...

  2. 利用MyEclipes的反转工程来配置Hibernate各种配置

    首先需要有设计好的数据库,然后创建一个Web Project然后右键点击项目选择MyEclipse→add Hibernate Capabilities →→ →→,然后如果没有管理员的话需要在选择M ...

  3. Centos配置Caffe详解

    http://www.tuicool.com/articles/uiuA3e

  4. c++的学习内容一汇总篇(常更新)

    在这里假定读者们是有一定编程经验的.例如c#,java,c或者其他任何编程语言. 所有语言都无外乎掌握它的语法,熟悉它的一些库的调用. ---------------语法篇-------------- ...

  5. 说说oracle分页的sql语句

    说说oracle分页的sql语句,分排序和不排序两种. 当结果集不需要进行排序时,每页显示条数为:rowPerPage,当前页数为:currentPage. 1. 相对来说,这种查询速度会快一些,因为 ...

  6. Android—监听器

    网上有很多短信和电话监听的程序,使用Broadcast. 记得一年前自己对照视频和教材是能够实现的,这周打开视频和教材照猫画虎,无论怎么都不会,纠结啊! 问题原因: 3.0之后没有主动开启过的应用无法 ...

  7. C#抽象类及其方法的学习【转】

    转至 http://www.cnblogs.com/flyinthesky/archive/2008/06/18/1224774.html 在C#中使用关键字 abstract 来定义抽象类和抽象方法 ...

  8. Angularjs之表单实例(三)

    正确引用js css文件后可运行 <!DOCTYPE html> <html ng-app='myApp'> <head> <title>Bootstr ...

  9. COM编程之三 QueryInterface

    [1]IUnknown接口 客户同组件交互都是通过接口完成的. 在客户查询组件的其它接口时,也是通过接口完成的.而那个接口就是IUnknown. IUnknown接口的定义包含在Win32SDK中的U ...

  10. Spring MVC 和 Spring 总结

    1. 为什么使用Spring ? 1). 方便解耦,简化开发 通过Spring提供的IoC容器,可以将对象之间的依赖关系交由Spring进行控制,避免硬编码所造成的过度程序耦合. 2). AOP编程的 ...