Codeforces 633C Spy Syndrome 2 | Trie树裸题

一个由许多空格隔开的单词组成的字符串,进行了以下操作:把所有字符变成小写,把每个单词颠倒过来,然后去掉单词间的空格。已知操作后的字符串以及可能出现的所有单词,请输出原字符串(多组解只输出一个)。

我犯的错误:数组的trie树……如果根节点是1……则其余节点要从2开始啊啊啊

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. using namespace std;
  5. typedef long long ll;
  6. #define space putchar(' ')
  7. #define enter putchar('\n')
  8. #define INF 0x3f3f3f3f
  9. template <class T>
  10. void read(T &x){
  11. char c;
  12. bool op = 0;
  13. while(c = getchar(), c < '0' || c > '9')
  14. if(c == '-') op = 1;
  15. x = c - '0';
  16. while(c = getchar(), c >= '0' && c <= '9')
  17. x = x * 10 + c - '0';
  18. if(op) x = -x;
  19. }
  20. template <class T>
  21. void write(T x){
  22. if(x < 0) putchar('-'), x = -x;
  23. if(x >= 10) write(x / 10);
  24. putchar('0' + x % 10);
  25. }
  26. const int N = 1001000;
  27. int n, m, dp[N], pos[N], len[N], cnt = 1, stk[N], top;
  28. char a[N], s[N];
  29. struct node {
  30. int son[26], id;
  31. node(){
  32. id = 0;
  33. memset(son, 0, sizeof(son));
  34. }
  35. } trie[N];
  36. char low(char c){
  37. return c >= 'a' ? c : c - 'A' + 'a';
  38. }
  39. void insert(int id, char *s){
  40. int now = 1;
  41. len[id] = strlen(s);
  42. for(int i = 0; i < len[id]; i++){
  43. int c = low(s[i]) - 'a';
  44. if(!trie[now].son[c]) trie[now].son[c] = ++cnt;
  45. now = trie[now].son[c];
  46. }
  47. trie[now].id = id;
  48. }
  49. int main(){
  50. read(n);
  51. scanf("%s", a + 1);
  52. read(m);
  53. for(int i = 1; i <= m; i++){
  54. pos[i] = pos[i - 1] + len[i - 1];
  55. scanf("%s", s + pos[i]);
  56. insert(i, s + pos[i]);
  57. }
  58. for(int i = 1; i <= n; i++){
  59. dp[i] = -1;
  60. int now = 1;
  61. for(int j = 0; i - j > 0 && now; j++){
  62. now = trie[now].son[a[i - j] - 'a'];
  63. if(trie[now].id && dp[i - j - 1] != -1){
  64. dp[i] = trie[now].id;
  65. break;
  66. }
  67. }
  68. }
  69. for(int i = n; i > 0; i -= len[dp[i]])
  70. stk[++top] = dp[i];
  71. for(int i = top; i; i--){
  72. for(int j = 0; j < len[stk[i]]; j++)
  73. putchar(s[pos[stk[i]] + j]);
  74. putchar(' ');
  75. }
  76. enter;
  77. return 0;
  78. }

Codeforces 633C Spy Syndrome 2 | Trie树裸题的更多相关文章

  1. Codeforces 633C Spy Syndrome 2 【Trie树】+【DFS】

    <题目链接> 题目大意:给定一个只有小写字母组成的目标串和m个模式串(里面可能有大写字母),记目标串反过来后的串为S,让你从m个模式串中选出若干个组成S串(不区分大小写).输出任意一种方案 ...

  2. codeforces 633C. Spy Syndrome 2 hash

    题目链接 C. Spy Syndrome 2 time limit per test 2 seconds memory limit per test 256 megabytes input stand ...

  3. [codeforces] 633C Spy Syndrome 2

    原题 Trie树+dp 首先,我们可以简单的想到一种dp方式,就是如果这一段可以匹配并且可以与前一段接上,那么更新dp[i]为当前字符串的编号,然后倒推就可以得到答案. 但是,显然我们不能O(m)比较 ...

  4. Codeforces 633C Spy Syndrome 2(DP + Trie树)

    题目大概说给一个加密的字符串,加密规则是把原文转化成小写字母,然后各个单词反转,最后去掉空格.现在给几个已知的单词,还原加密的字符串. 和UVa1401一个道理.. 用dp[i]表示加密字符前i个字符 ...

  5. CF633C Spy Syndrome 2 trie树

    这个模型以前绝对见过,模拟赛的时候开始敲了一个AC自动机,纯属脑抽~ code: #include <bits/stdc++.h> #define N 5000006 #define NN ...

  6. HDU 1251 Trie树模板题

    1.HDU 1251 统计难题  Trie树模板题,或者map 2.总结:用C++过了,G++就爆内存.. 题意:查找给定前缀的单词数量. #include<iostream> #incl ...

  7. POJ 3468 线段树裸题

    这些天一直在看线段树,因为临近期末,所以看得断断续续,弄得有些知识点没能理解得很透切,但我也知道不能钻牛角尖,所以配合着刷题来加深理解. 然后,这是线段树裸题,而且是最简单的区间增加与查询,我参考了A ...

  8. poj3630 Phone List (trie树模板题)

    Phone List Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 26328   Accepted: 7938 Descr ...

  9. HDU 1251 统计难题 (Trie树模板题)

    题目链接:点击打开链接 Problem Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单 ...

随机推荐

  1. svn树冲突的解决方法

    树冲突 就是开发人员移动.重命名.删除一个文件或文件夹,而另一名开发人员也对它们进行了移动.重命名.删除或者仅仅是修改时就会发生树冲突.有很多种不同的情形可以导致树冲突,而且不同的情形需要不同的步骤来 ...

  2. SQL Operations Studio的安装和使用

    之前管理和访问SQL SERVER使用的自然是SSMS,功能确实很强大的一个数据库图形化管理软件,但是SSMS有个问题就是体积超级大,启动速度也就比较慢.今天我正好要学习一些T-SQL的内容,在微软的 ...

  3. 《how tomcat works》阅读笔记 - 2 - 门面设计模式,避免强制转换

    在第二章 2.3节中 try { servlet = (Servlet) myClass.newInstance(); servlet.service((ServletRequest) request ...

  4. Codeforces Round #515 (Div. 3) 解题报告(A~E)

    题目链接:http://codeforces.com/contest/1066 1066 A. Vova and Train 题意:Vova想坐火车从1点到L点,在路上v的整数倍的点上分布着灯笼,而在 ...

  5. vue项目部署流程

    用vue-cli搭建的做法1.npm run build2.把dist里的文件打包上传至服务器 例 /data/www/,我一般把index.html放在static里所以我的文件路径为:/data/ ...

  6. python其他知识目录

    博客目录总纲首页 基础的重要性(程序员之路) 做一个“合格”的程序员(一)——基础能力 作为一个程序员,数学对你到底有多重要 同样是程序员,为什么别人比你更优秀? ------------------ ...

  7. basename命令详解

    基础命令学习目录首页 摘要:前言bashname命令用于获取路径中的文件名或路径名(获取的时候叶子节点的元素内容)常见用法举例basenamepath获取末尾的文件名或路径名1:[aliyunzixu ...

  8. halt命令详解

    基础命令学习目录首页 原文链接:https://www.jb51.net/LINUXjishu/57947.html 名称:halt 使用权限:系统管理者 halt 使用方式:halt [-n] [- ...

  9. 插件使用-HighChart

    一.介绍 让数据可视化更简单,兼容 IE6+.完美支持移动端.图表类型丰富.方便快捷的 HTML5 交互性图表库. 官网(英):https://www.highcharts.com/download ...

  10. +new Date()的用法

    var s=+newDate();   var s=+newDate(); 解释如下:=+是不存在的; +new Date()是一个东西; +相当于.valueOf(); 看到回复补充一下.getTi ...