http://acm.hdu.edu.cn/showproblem.php?pid=2846

题意:给出N个模式串,再给出M个文本串,问每一个文本串在多少个模式串中出现。

思路:平时都是找前缀的,这里将模式串s[1……len]的每一个[i,len]的子串都插入,这样就可以满足条件。还要注意如果两个子串都为同一个模式串的子串,不能重复计数。可以用一个id数组装上一次是哪个串的id,如果id相同就不要重复计数了。

  1. #include <cstdio>
  2. #include <algorithm>
  3. #include <iostream>
  4. #include <cstring>
  5. #include <string>
  6. #include <cmath>
  7. #include <queue>
  8. #include <vector>
  9. using namespace std;
  10. #define N 2000010
  11. char s[];
  12. struct Trie
  13. {
  14. int ch[N][], num, cnt[N], id[N]; //空间尽量开大点
  15.  
  16. void init()
  17. {
  18. memset(ch[], , sizeof(ch[]));
  19. num = ;
  20. }
  21.  
  22. void update(char *s, int index)
  23. {
  24. int u = ;
  25. int len = strlen(s);
  26. for(int i = ; i < len; i++) {
  27. int tmp = s[i] - 'a';
  28. if(!ch[u][tmp]) {
  29. memset(ch[num], , sizeof(ch[num]));
  30. cnt[num] = ;
  31. id[num] = ;
  32. ch[u][tmp] = num++;
  33. }
  34. u = ch[u][tmp];
  35. if(id[u] != index) cnt[u]++;
  36. id[u] = index; //标记上一个是否是相同的串,如果相同不能重复计数
  37. }
  38. }
  39.  
  40. int query(char *s)
  41. {
  42. int u = ;
  43. int len = strlen(s);
  44. for(int i = ; i < len; i++) {
  45. int tmp = s[i] - 'a';
  46. if(!ch[u][tmp]) return ;
  47. u = ch[u][tmp];
  48. }
  49. return cnt[u];
  50. }
  51. }trie;
  52.  
  53. int main()
  54. {
  55. int n;
  56. scanf("%d", &n);
  57. trie.init();
  58. for(int i = ; i <= n; i++) {
  59. scanf("%*c%s", s);
  60. int len = strlen(s);
  61. for(int j = ; j < len; j++) {
  62. trie.update(s + j, i); //每一个串的以s[j]开头的子串都要插入
  63. }
  64. }
  65. scanf("%d", &n);
  66. for(int i = ; i < n; i++) {
  67. scanf("%*c%s", s);
  68. printf("%d\n", trie.query(s));
  69. }
  70. return ;
  71. }

HDU 2846:Repository(Trie)的更多相关文章

  1. HDU 1671 Phone List (Trie)

    pid=1671">Phone List Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ( ...

  2. HDU 5791:Two(DP)

    http://acm.hdu.edu.cn/showproblem.php?pid=5791 Two Problem Description   Alice gets two sequences A ...

  3. HDU 1251-统计难题(Trie)

    题意: 给一组单词 开始提问每次给一个串求该串是上面几个单词的前缀 分析: 没给数据规模,但用链表写ME好几次,又用数组写开小RE了,试了几次才过了,真是醉了... #include <map& ...

  4. HDU 1896:Stones(优先队列)

    Stones Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Sub ...

  5. HDU 1263:水果(map)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1263 #include <stdio.h> #include <string.h&g ...

  6. HDU 1251 统计难题 (Trie)

    pid=1251">统计难题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/ ...

  7. HDU 1260:Tickets(DP)

    Tickets Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Su ...

  8. C#进阶系列——DDD领域驱动设计初探(二):仓储Repository(上)

    前言:上篇介绍了DDD设计Demo里面的聚合划分以及实体和聚合根的设计,这章继续来说说DDD里面最具争议的话题之一的仓储Repository,为什么Repository会有这么大的争议,博主认为主要原 ...

  9. C#进阶系列——DDD领域驱动设计初探(三):仓储Repository(下)

    前言:上篇介绍了下仓储的代码架构示例以及简单分析了仓储了使用优势.本章还是继续来完善下仓储的设计.上章说了,仓储的最主要作用的分离领域层和具体的技术架构,使得领域层更加专注领域逻辑.那么涉及到具体的实 ...

随机推荐

  1. git 查看、创建、删除 本地,远程 分支

    1. 查看远程分支 git branch -rorigin/master 2. 查看本地分支 git branch *master 注:以*开头指明现在所在的本地分支 3. 查看本地分支和远程分支 g ...

  2. iOS - (TableView中利用系统的 cell 设置 cell.textlabel 位置和大小)

    今天工作稍微的遇到了一点小小的难题,需求效果中 TableView cell 中的 Label 字体大小比原先系统中的要大些且 Label 位置不是在前面,而是在中间往后,对于这个问题我第一时间也是想 ...

  3. 提高你的C#程序编码质量

    摘自陆敏技之<编写高质量代码:改善C#程序的157个建议>,编写C#程序代码时应考虑代码效率.安全和美观,可参考下述建议.想成为一名合格的搬砖工,牢记吧!! 基本语言要素 1.正确操作字符 ...

  4. set ver on/off

    set   verify(或ver)   on/off可以设置是否显示替代变量被替代前后的语句 SQL> set verify on SQL> select &num from d ...

  5. PAT 解题报告 1047. Student List for Course (25)

    1047. Student List for Course (25) Zhejiang University has 40000 students and provides 2500 courses. ...

  6. 《数据结构与算法分析:C语言描述_原书第二版》CH2算法分析_课后习题_部分解答

    对于一个初学者来说,作者的Solutions Manual把太多的细节留给了读者,这里尽自己的努力给出部分习题的详解: 不当之处,欢迎指正. 1.  按增长率排列下列函数:N,√2,N1.5,N2,N ...

  7. nyist 596 谁是最好的Coder

    http://acm.nyist.net/JudgeOnline/problem.php?pid=596 谁是最好的Coder 时间限制:1000 ms  |  内存限制:65535 KB 难度:0 ...

  8. SOL面向对象 五大原则

    单一职责原则SRP(Single Responsibility Principle)是指一个类的功能要单一,不能包罗万象.如同一个人一样,分配的工作不能太多,否则一天到晚虽然忙忙碌碌的,但效率却高不起 ...

  9. 实验一 操作系统模仿cmd

    实验一.命令解释程序的编写 专业:商软(2)班   姓名:王俊杰  学号:201406114252 一.        实验目的 (1)掌握命令解释程序的原理: (2)掌握简单的DOS调用方法: (3 ...

  10. cannot modify header information 关于实现widget页面跳转的问题

    查找网上解决此问题的方法多是一样的,不过今天又遇到了这样的问题.试过之后发现可行: 在C盘的WINDOWS或者你的PHP文件夹中找到php.ini 这个配置文件,然后查找一项:output_buffe ...