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]代表前 ...
随机推荐
- appium===使用weditor代替ui automator viewer
weditor 一个元素定位工具,并可实现通过wifi连接移动端进行定位. https://github.com/openatx/uiautomator2 python安装方式: pip instal ...
- linux dpm机制分析(下)【转】
转自:http://blog.csdn.net/lixiaojie1012/article/details/23707901 1 设备注册到dpm_list路径 (Platform_devi ...
- OWASP SSL 高级审查工具
http://www.linuxidc.com/Linux/2016-03/129164.htm InfoWorld 在部署.运营和保障网络安全领域精选出了年度开源工具获奖者. 最佳开源网络和安全软件 ...
- EF添加ADO.NET实体模型处直接选择Oracle数据源
上一文介绍了如何下载Mysql for vs Tools来进行Mysql的ADO.NET实体模型数据源选择,今天将Oracle的测试了下.步骤如下: 1.在你项目Model层中nuget安装选中项 2 ...
- JQuery一个对象绑定多个事件
jQuery("#id").click(func1).mouseover(func2)//方法连写,func为方法的名字 jQuery("#id").click ...
- linux下运行jmeter脚本
1. win下生成测试计划 2. 上传至linux下 3.运行测试计划 sh jmeter.sh -n -t second_login.jmx -l res.jtl 错误1: solution ...
- Xshell 找到上次执行的命令
ctrl + p 返回上一次输入命令字符 ctrl + r 输入单词搜索历史命令
- UVALive 6426
UVALive 6426 /** 题意:给一个n*m的矩阵,求某一个区间的数的数量 做法:刚开始想用树状数组,但是RE,题目中说数据是从二进制流中读入, 用scanf会挂掉 所以用fread 读入 s ...
- Fel表达式使用过程中需要注意的问题
精度问题: 我们知道java中直接使用float和double参与的计算都可能会产生精度问题,比如0.1+0.3.1.0-0.9 等.所以一般财务系统,都会使用BigDecimal进行加减乘除. 在调 ...
- Python+Selenium 自动化实现实例-Css捕捉元素的几种方法
#coding=utf-8 from selenium import webdriverimport timedriver = webdriver.Chrome()driver.get("h ...