Manthan, Codefest 16 C. Spy Syndrome 2 字典树 + dp
C. Spy Syndrome 2
题目连接:
http://www.codeforces.com/contest/633/problem/C
Description
After observing the results of Spy Syndrome, Yash realised the errors of his ways. He now believes that a super spy such as Siddhant can't use a cipher as basic and ancient as Caesar cipher. After many weeks of observation of Siddhant’s sentences, Yash determined a new cipher technique.
For a given sentence, the cipher is processed as:
Convert all letters of the sentence to lowercase.
Reverse each of the words of the sentence individually.
Remove all the spaces in the sentence.
For example, when this cipher is applied to the sentence
Kira is childish and he hates losing
the resulting string is
ariksihsidlihcdnaehsetahgnisol
Now Yash is given some ciphered string and a list of words. Help him to find out any original sentence composed using only words from the list. Note, that any of the given words could be used in the sentence multiple times.
Input
The first line of the input contains a single integer n (1 ≤ n ≤ 10 000) — the length of the ciphered text. The second line consists of n lowercase English letters — the ciphered text t.
The third line contains a single integer m (1 ≤ m ≤ 100 000) — the number of words which will be considered while deciphering the text. Each of the next m lines contains a non-empty word wi (|wi| ≤ 1 000) consisting of uppercase and lowercase English letters only. It's guaranteed that the total length of all words doesn't exceed 1 000 000.
Output
Print one line — the original sentence. It is guaranteed that at least one solution exists. If there are multiple solutions, you may output any of those.
Sample Input
30
ariksihsidlihcdnaehsetahgnisol
10
Kira
hates
is
he
losing
death
childish
L
and
Note
Sample Output
Kira is childish and he hates losing
Hint
题意
你有一堆单词,然后把这一堆单词都翻转了,然后拼成了一个串。
然后现在给你一个串,让你找到原来拼的那些单词是什么。
题解:
字典树+dp
直接把那个串翻转一下,就相当于倒着做了嘛
然后我们跑dp就好了,vis[i]表示这个位置能否被转移到
然后我们就开始在字典树上面跑啊跑,看最远能够跑到哪儿,跑到了都打一个vis[i]=1,然后记录一个pre
然后再倒着输出一个就完了。
注意大小写……
代码
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e6+5;
struct node{
int ptr[26] , c ;
};
char s[maxn];
int tot;
int vis[maxn];
int pre[maxn];
node t[maxn];
void init_node(node & f){
memset(f.ptr , 0 , sizeof(f.ptr));
f.c = 0;
}
void init(){
tot = 1 ; init_node(t[0]);
}
inline int GetIdx(char ch){
return ch - 'a';
}
void in(string str)
{
int cur = 0;
for(int i = 0 ; i < str.size() ; ++ i)
{
int idx = GetIdx(str[i]);
if(t[cur].ptr[idx])
cur = t[cur].ptr[idx];
else
{
init_node(t[tot]);
cur = t[cur].ptr[idx] = tot ++ ;
}
}
t[cur].c++;
}
void solve2(int x)
{
int o = x;
x++;
int cur=0,step=0;
while(1)
{
int idx = GetIdx(s[x++]);
if(t[cur].ptr[idx]) cur = t[cur].ptr[idx];
else return;
step ++;
if(t[cur].c)vis[o+step]=1,pre[o+step]=o;
}
}
int n,m;
map<string,string> H;
vector<string>ans;
void solve1()
{
scanf("%d",&m);
while(m--)
{
string s1,s2,s3;
cin>>s1;
for(int i=0;i<s1.size();i++)
{
s2+=s1[i];
if(s1[i]<='Z'&&s1[i]>='A')s1[i]=s1[i]+'a'-'A';
s3+=s1[i];
}
H[s3] = s2;
in(s1);
}
}
int main()
{
init();
scanf("%d%s",&n,s+1);
reverse(s+1,s+1+n);
solve1();
vis[0]=1;
for(int i=0;i<n;i++)
if(vis[i])
solve2(i);
while(n)
{
string tmp;
for(int i=pre[n]+1;i<=n;i++)
tmp+=s[i];
ans.push_back(H[tmp]);
n=pre[n];
}
for(int i=0;i<ans.size();i++)
cout<<ans[i]<<" ";
cout<<endl;
}
Manthan, Codefest 16 C. Spy Syndrome 2 字典树 + dp的更多相关文章
- Manthan, Codefest 16 -C. Spy Syndrome 2
time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standa ...
- CF #Manthan, Codefest 16 C. Spy Syndrome 2 Trie
题目链接:http://codeforces.com/problemset/problem/633/C 大意就是给个字典和一个字符串,求一个用字典中的单词恰好构成字符串的匹配. 比赛的时候是用AC自动 ...
- Codeforces 633 C Spy Syndrome 2 字典树
题意:还是比较好理解 分析:把每个单词反转,建字典树,然后暴力匹配加密串 注:然后我就是特别不理解,上面那种能过,而且时间很短,但是我想反之亦然啊 我一开始写的是,把加密串进行反转,然后单词正着建字典 ...
- CF Manthan, Codefest 16 G. Yash And Trees 线段树+bitset
题目链接:http://codeforces.com/problemset/problem/633/G 大意是一棵树两种操作,第一种是某一节点子树所有值+v,第二种问子树中节点模m出现了多少种m以内的 ...
- Codeforces 633C Spy Syndrome 2 | Trie树裸题
Codeforces 633C Spy Syndrome 2 | Trie树裸题 一个由许多空格隔开的单词组成的字符串,进行了以下操作:把所有字符变成小写,把每个单词颠倒过来,然后去掉单词间的空格.已 ...
- UVALive 3942 Remember the Word 字典树+dp
/** 题目:UVALive 3942 Remember the Word 链接:https://vjudge.net/problem/UVALive-3942 题意:给定一个字符串(长度最多3e5) ...
- Manthan, Codefest 16
暴力 A - Ebony and Ivory import java.util.*; import java.io.*; public class Main { public static void ...
- LA 3942 - Remember the Word (字典树 + dp)
https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...
- HDU5715 XOR 游戏 二分+字典树+dp
当时Astar复赛的时候只做出1题,赛后补题(很长时间后才补,懒真是要命),发现这是第二简单的 分析: 这个题,可以每次二分区间的最小异或和 进行check的时候用dp进行判断,dp[i][j]代表前 ...
随机推荐
- 【Python学习】使用Pyinstaller将py文件导出为exe文件
PyInstaller其实就是把python解析器和你自己的脚本打包成一个可执行的文件,但是它不是跨编译的,也就是说在Windows下用PyInstaller生成的exe只能运行在Windows下,在 ...
- 自动化测试===unittest和requests接口测试案例,测试快递查询api(二)
在原来基础上生成测试报告: 首先需要 HTMLTestRunner.py 的unittest生成报告文件 (源码,自动化测试===unittest配套的HTMLTestRunner.py生成html ...
- linux-open-source-development-tools【重点】
https://www.pluralsight.com/blog/software-development/linux-open-source-development-tools https://ww ...
- python爬虫面试总结
1.爬虫有哪些模块? 答: URL管理模块:维护已经爬取的URL集合和未爬取的URL集合,并提供获取新URL链接的接口 HTML下载模块:从URL管理器中获取未爬取的URL链接并下载HTML网页 HT ...
- 用selenium 模块控制浏览器
11.8 用selenium 模块控制浏览器selenium 模块让Python 直接控制浏览器,实际点击链接,填写登录信息,几乎就像是有一个人类用户在与页面交互.与Requests 和Beautif ...
- react生命周期函数使用箭头函数,导致mobx-react问题
最近新人加入了项目,遇到了一个很奇怪的问题.mobx observable 属性,onChange的时候就是页面不会刷新. 试来试去,就是不知道什么原因,后来其他同事查到是因为componentWil ...
- react native 手势响应
参考地址:https://www.jianshu.com/p/935e5c6a5064 官方文档地址:https://facebook.github.io/react-native/docs/panr ...
- Ubuntu 18.04安装网易云音乐(转载)
作为Ubuntu下唯一一款超级好用的音乐软件,必须下载. 提升为root权限后操作 0 : 网易云音乐1.0.0(该版本较为好安装)下载地址 http://s1.music.126.net/downl ...
- gvim代码补全
gvim 代码自动提示 插件 插件名:AutoComplPop 下载地址:http://www.vim.org/scripts/script.php?script_id=1879 gvim 代码模板补 ...
- mysql source 乱码
mysql -u root -p --default-character-set=utf8 use dbname source /root/newsdata.sql