嘟嘟嘟

题面:把一句话加密:1.所有字母变成小写。2.翻转所有单词。3.去掉空格。然后给你一句加密后的字符串以及一些出现在原句和没有出现在原句的单词,让你还原原句。注意,每一个单词可以使用多次,如果有多个答案,输出其中任意一个。

trie树好题……

首先都能想到的是把所有单词建成一棵trie树,然后我是这么想的,对于加密后字符串,每句每一个字符作为单词结尾,然后倒着再trie树上跑,知道遇到一个单词,记录是第几个,最后输出。

但是这样是不对的,因为无法保证遇到一个单词后,这个单词之前的部分已经匹配好了,举个例子:High,加密后是hgih,然后给定的单词有 hi 和 high,当扫到最后一个字符'h'的时候,在trie树上得到的第一个单词是 hi,而hi之前的gh无法构成一个单词,所以gg。

因此,我们还要有一个pre数组,记录每一个匹配点的上一个是由哪一个匹配点转移过来的,在trie树上跑的时候,只有当前点构成一个单词,且这个单词的前一个字符是匹配点,才return。

最后沿着pre数组找到头,倒叙输出。

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<cmath>
 5 #include<cstring>
 6 #include<cstdlib>
 7 #include<cctype>
 8 #include<stack>
 9 #include<queue>
10 #include<vector>
11 using namespace std;
12 #define enter puts("")
13 #define space putchar(' ')
14 #define Mem(a, x) memset(a, x, sizeof(a))
15 #define rg register
16 typedef long long ll;
17 typedef double db;
18 const int INF = 0x3f3f3f3f;
19 const db eps = 1e-8;
20 const int maxn = 1e4 + 5;
21 const int maxm = 1e5 + 5;
22 inline ll read()
23 {
24   ll ans = 0;
25   char ch = getchar(), las = ' ';
26   while(!isdigit(ch)) las = ch, ch = getchar();
27   while(isdigit(ch)) ans = ans * 10 + ch - '0', ch = getchar();
28   if(las == '-') ans = -ans;
29   return ans;
30 }
31 inline void write(ll x)
32 {
33   if(x < 0) putchar('-'), x = -x;
34   if(x >= 10) write(x / 10);
35   putchar(x % 10 + '0');
36 }
37
38 int n, m;
39 char s[maxn], ss[maxm][1005];
40
41 int cnt = 0;
42 struct Trie
43 {
44   int ch[26], val;
45   Trie()
46   {
47     Mem(ch, 0); val = 0;
48   }
49 }t[maxm * 10];
50 int getnum(char c)
51 {
52   return c >= 'a' ? c - 'a' : c - 'A';
53 }
54 void insert(int id, char *s)
55 {
56   int len = strlen(s);
57   for(int i = 0, now = 0; i < len; ++i)
58     {
59       int c = getnum(s[i]);
60       if(!t[now].ch[c]) t[now].ch[c] = ++cnt;
61       now = t[now].ch[c];
62       if(i == len - 1) t[now].val = id;
63     }
64 }
65
66 int ans[maxn], pre[maxn];
67 void query(int x)
68 {
69   for(int i = x, now = 0; i >= 0; --i)
70     {
71       int c = getnum(s[i]);
72       if(!t[now].ch[c]) return;
73       now = t[now].ch[c];
74       if(t[now].val && (ans[i - 1] || i == 0)) {pre[x] = i - 1, ans[x] = t[now].val; return;}
75     }
76   return;
77 }
78
79
80 void print(int x)
81 {
82   if(pre[x] != -1) print(pre[x]);
83   printf("%s ", ss[ans[x]]);
84 }
85
86 int main()
87 {
88   n = read(); scanf("%s", s);
89   m = read();
90   for(int i = 1; i <= m; ++i)
91     {
92       scanf("%s", ss[i]);
93       insert(i, ss[i]);
94     }
95   for(int i = 0; i < n; ++i) query(i);
96   print(n - 1); enter;
97   return 0;
98 }

View Code

转载于:https://www.cnblogs.com/mrclr/p/9767199.html

CF633C Spy Syndrome 2相关推荐

  1. CF633C Spy Syndrome 2(字典树+dp)

    CF633C Spy Syndrome 2 原题链接 说是 dpdpdp 但是感觉说是一个记忆化也可以.我们定义一个 dpdpdp 数组,其 dp[i]dp[i]dp[i] 含义为将加密串前 iii ...

  2. CF633C Spy Syndrome 2 trie树

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

  3. CF633C Spy Syndrome 2 ACA+DP

    思路 首先把原串取反一下,就可以用mmm个正序模式串做匹配了. 定义dp[i]dp[i]dp[i]表示1-i1\dots i1-i的匹配状态(0或1), 然后对mmm个串插入到AC自动机上构造fail ...

  4. Codeforces633C Spy Syndrome 2 (单词Trie)

    题目链接: Spy Syndrome 2 大致题意 给定一个长度为n的字符串str, 全部由小写字母组成. 接下来给出单词列表, 共包含m个单词, 每个单词由大写和小写字母组成. 字符串str可以保证 ...

  5. Codeforces C. Spy Syndrome 2

    题意: 给你一个长度为n的字符串S,和m个字符串T,询问能不能用这些字符串T将他们倒序,然后组成S 题解: 将这些m个字符串T,倒序放入Trie树中,然后用S在Trie树上匹配就好了 AC代码: #i ...

  6. Practice II 字符串

    本来想做数论的--但是别的dalao都在做制胡窜 所以-- Chapter I KMP KMP 最关键的不是这个半暴力的单模匹配 而是这个nxt数组 经常出一些奇怪的题 尤其是循环节可以直接由T-nx ...

  7. 谷歌空间从服务器检索信息时出错,谷歌,火狐提示来自http://xxx.com/file的资源已被阻止,因为 MIME 类型(text/plain)不匹配(X-Content-Type-Opt...

    在使用ueditor编辑的过程中无法上传图片,谷歌火狐浏览器提示Cross-Origin Read Blocking (CORB) blocked cross-origin response http ...

  8. Manthan, Codefest 16

    暴力 A - Ebony and Ivory import java.util.*; import java.io.*;public class Main {public static void ma ...

  9. 如何用SPY++工具查看窗体的句柄

    我安装的是vs2012,先找到SPY++工具打开 打开方式: 方式1:通过路径(C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Microso ...

最新文章

  1. Flutter中的提示工具
  2. php method_exists 检测类中是否包括函数
  3. 论文的写作要求、流程与写作技巧
  4. 《Python地理数据处理》——导读
  5. java converter转换器_在SpringMVC中设置自定义类型转换器Converter
  6. 六级词汇打卡第二天(二)
  7. python post请求参数化,参数化包含JSON主体的python POST请求
  8. UI-12组结对编程作业总结
  9. vue登录如何存储cookie_vue登录模块,登录状态应该存在哪里,怎么防止手动改cookie、localStorage?...
  10. 线性代数中矩阵相乘如何计算
  11. MapGuide应用最佳实践—MapGuide Server和MapGuide WebExtension分开部署
  12. VS2010创建OCX控件
  13. 百度html模板引擎,百度JS模板引擎 baiduTemplate
  14. Mac通讯录管理软件BusyContacts安装教程
  15. python经典书籍推荐-7本经典的Python书籍,你都读过了么?
  16. Namesilo域名解析详细图文教程!
  17. mysql错误1548 Cannot load from mysql.proc的最终解决方法
  18. 前端网络请求的错误处理
  19. 小米 admob广告 ID_如何评价即将发布的小米盒子4?
  20. 初始java ~ 逻辑控制

热门文章

  1. mysql handlers,2 Handlers
  2. boot界面上下键调节键不能动_手机音量键还有这5大作用,你知道几条?
  3. 修改oracle数据连接数据库,修改Oracle数据库的连接数
  4. java生成word 框勾_Java 使用模板生成 Word 文件---基于 Freemarker 模板框架
  5. python string模块安装_python String模块-阿里云开发者社区
  6. CVPR 2020 运行12-in-1遇到的问题及解决办法(持续更新中)
  7. 2020-07-03 CVPR2020 i3DV论文讨论(2) 笔记
  8. BZOJ 4849 [NEERC2016] Mole Tunnels (模拟费用流)
  9. λ-矩阵(λ-矩阵在初等变换下的标准形)
  10. saiku添加mysql数据源_Saiku连接mysql数据库(二)