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的更多相关文章

  1. Manthan, Codefest 16 -C. Spy Syndrome 2

    time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standa ...

  2. CF #Manthan, Codefest 16 C. Spy Syndrome 2 Trie

    题目链接:http://codeforces.com/problemset/problem/633/C 大意就是给个字典和一个字符串,求一个用字典中的单词恰好构成字符串的匹配. 比赛的时候是用AC自动 ...

  3. Codeforces 633 C Spy Syndrome 2 字典树

    题意:还是比较好理解 分析:把每个单词反转,建字典树,然后暴力匹配加密串 注:然后我就是特别不理解,上面那种能过,而且时间很短,但是我想反之亦然啊 我一开始写的是,把加密串进行反转,然后单词正着建字典 ...

  4. CF Manthan, Codefest 16 G. Yash And Trees 线段树+bitset

    题目链接:http://codeforces.com/problemset/problem/633/G 大意是一棵树两种操作,第一种是某一节点子树所有值+v,第二种问子树中节点模m出现了多少种m以内的 ...

  5. Codeforces 633C Spy Syndrome 2 | Trie树裸题

    Codeforces 633C Spy Syndrome 2 | Trie树裸题 一个由许多空格隔开的单词组成的字符串,进行了以下操作:把所有字符变成小写,把每个单词颠倒过来,然后去掉单词间的空格.已 ...

  6. UVALive 3942 Remember the Word 字典树+dp

    /** 题目:UVALive 3942 Remember the Word 链接:https://vjudge.net/problem/UVALive-3942 题意:给定一个字符串(长度最多3e5) ...

  7. Manthan, Codefest 16

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

  8. LA 3942 - Remember the Word (字典树 + dp)

    https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...

  9. HDU5715 XOR 游戏 二分+字典树+dp

    当时Astar复赛的时候只做出1题,赛后补题(很长时间后才补,懒真是要命),发现这是第二简单的 分析: 这个题,可以每次二分区间的最小异或和 进行check的时候用dp进行判断,dp[i][j]代表前 ...

随机推荐

  1. mysql查询语句的执行顺序(重点)

    一 SELECT语句关键字的定义顺序 SELECT DISTINCT <select_list> FROM <left_table> <join_type> JOI ...

  2. 网络知识===wireshark抓包出现“TCP segment of a reassembled PDU”的解释(载)

    网上胡说八道,众说风云,感觉这篇还算靠谱点. 原文链接:http://blog.csdn.net/dog250/article/details/51809566 为什么大家看到这个以后总是会往MSS, ...

  3. 使用node.js做一个自用的天气插件

    var request = require('request') var url = 'http://www.baidu.com/home/xman/data/superload' var cooki ...

  4. http状态码+http请求方式

    一.http状态码 2开头 (请求成功)表示成功处理了请求的状态代码. 200   (成功)  服务器已成功处理了请求. 通常,这表示服务器提供了请求的网页. 201   (已创建)  请求成功并且服 ...

  5. angular数据绑定---js全局学习

    <!DOCTYPE html> <html ng-app> <head> <title>Simple app</title> </he ...

  6. STL容器之间的差异和联系

     1.vector  (连续的空间存储,可以使用[]操作符)快速的访问随机的元素,快速的在末尾插入元素,但是在序列中间的插入,删除元素要慢(涉及元素复制移动),而且如果一开始分配的空间不够的话,有一个 ...

  7. 单文件组件(single-file components)

    介绍 我们可以使用预处理器来构建简洁和功能更丰富的组件,比如 Pug,Babel (with ES2015 modules),和 Stylus.

  8. SEO页面标题Title的优化

    我在一个月前改过页面标题(Title),随后表现是:百度网页快照4天不更新,Google正常.而我仅仅是改了两个词组而已.在建博初期,修改Title的最频繁的时期,下面卢松松就我经历的修改Title过 ...

  9. js正则表达大合集【转载自:http://caibaojian.com】

    [注明原文链接吧]:http://caibaojian.com 1 用户名正则 //用户名正则,4到16位(字母,数字,下划线,减号) var uPattern = /^[a-zA-Z0-9_-]{4 ...

  10. LoadRunner中常用函数参考手册

    基础篇1:LoadRunner中常用函数参考手册 常用函数列表 web_url web_submmit_form VS web_submmit_data VS web_custom_request w ...