[codeforces] 633C Spy Syndrome 2
原题
Trie树+dp
首先,我们可以简单的想到一种dp方式,就是如果这一段可以匹配并且可以与前一段接上,那么更新dp[i]为当前字符串的编号,然后倒推就可以得到答案。
但是,显然我们不能O(m)比较,那么怎么办呢?
这时候就可以体现Trie树的意义了,我们在爬Trie树的过程中就可以完成判断所有合法的字符串。当我们可以更新一个dp的时候就break就好了。
#include<cstdio>
#include<cstring>
#include<vector>
#define M 1001000
#define N 10010
using namespace std;
int n,m,dp[M],l[M],cnt=2,now,ll,pos[M];
char s[M],t[M];
vector <int> v;
struct hhh
{
int son[26],is;
hhh()
{
is=0;
memset(son,0,sizeof(son));
}
}edge[M];
void add(int x)
{
now=1;
int q;
for (int i=ll+1;i<=ll+l[x];i++)
{
if (t[i]<'a') q='a'-'A';else q=0;
if (edge[now].son[t[i]-'a'+q]) now=edge[now].son[t[i]-'a'+q];
else
{
edge[now].son[t[i]-'a'+q]=cnt++;
now=edge[now].son[t[i]-'a'+q];
}
}
edge[now].is=x;
}
int main()
{
scanf("%d",&n);
scanf("%s",s+1);
scanf("%d",&m);
for (int i=1;i<=m;i++)
{
scanf("%s",t+ll+1);
pos[i]=ll+1;
l[i]=strlen(t+ll+1);
add(i);
ll+=l[i];
}
dp[0]=1;
for (int i=1;i<=n;i++)
{
now=1;
for (int j=1;j<=i && now;j++)
{
now=edge[now].son[s[i-j+1]-'a'];
if (edge[now].is && dp[i-j])
{
dp[i]=edge[now].is;
break;
}
}
}
for (int i=n;i>=1;i-=l[dp[i]])
v.push_back(dp[i]);
int ss=v.size();
for (int i=ss-1;i>=0;i--)
{
for (int j=1;j<=l[v[i]];j++)
putchar(t[pos[v[i]]+j-1]);
putchar(' ');
}
return 0;
}
[codeforces] 633C Spy Syndrome 2的更多相关文章
- Codeforces 633C Spy Syndrome 2 | Trie树裸题
Codeforces 633C Spy Syndrome 2 | Trie树裸题 一个由许多空格隔开的单词组成的字符串,进行了以下操作:把所有字符变成小写,把每个单词颠倒过来,然后去掉单词间的空格.已 ...
- codeforces 633C. Spy Syndrome 2 hash
题目链接 C. Spy Syndrome 2 time limit per test 2 seconds memory limit per test 256 megabytes input stand ...
- Codeforces 633C Spy Syndrome 2(DP + Trie树)
题目大概说给一个加密的字符串,加密规则是把原文转化成小写字母,然后各个单词反转,最后去掉空格.现在给几个已知的单词,还原加密的字符串. 和UVa1401一个道理.. 用dp[i]表示加密字符前i个字符 ...
- Codeforces 633C Spy Syndrome 2 【Trie树】+【DFS】
<题目链接> 题目大意:给定一个只有小写字母组成的目标串和m个模式串(里面可能有大写字母),记目标串反过来后的串为S,让你从m个模式串中选出若干个组成S串(不区分大小写).输出任意一种方案 ...
- CF#633C Spy Syndrome 2 DP+二分+hash
Spy Syndrome 2 题意 现在对某个英文句子,进行加密: 把所有的字母变成小写字母 把所有的单词反过来 去掉单词之间的空格 比如:Kira is childish and he hates ...
- Codeforce 633C. Spy Syndrome 2
C. Spy Syndrome 2 time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...
- Manthan, Codefest 16 C. Spy Syndrome 2 字典树 + dp
C. Spy Syndrome 2 题目连接: http://www.codeforces.com/contest/633/problem/C Description After observing ...
- Manthan, Codefest 16 -C. Spy Syndrome 2
time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standa ...
- Codeforce 633.C Spy Syndrome 2
C. Spy Syndrome 2 time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...
随机推荐
- I/O流、文件操作
1)操作文件 Path和Files是在JavaSE7中新添加进来的类,它们封装了在用户机器上处理文件系统所需的所有功能.Path表示的一个目录名序列,其后还可以跟着一个文件名.路径中的第一个参数可以是 ...
- TP5部署服务器问题总结
及最近部署TP5遇到了很多坑,各种环境下都会出现一些问题,下面是我记录的排坑之路 先说最简单的lnmp一键安装包,我用的是1.5稳定版 安装命令:wget http://soft.vpser.net/ ...
- 我是一个MySQL小白
我是一个MySQL小白 第一回早起装扮 “mysql,Oracle,SQL-SERVER你们三个 起床没?”,清晨七点多师父喊道. “师父,我(mysql)哪敢睡觉呀,我还在查询表呢,有客户的密码忘记 ...
- Leecode刷题之旅-C语言/python-104二叉树最大深度
/* * @lc app=leetcode.cn id=104 lang=c * * [104] 二叉树的最大深度 * * https://leetcode-cn.com/problems/maxim ...
- go学习笔记-类型转换(Type Conversion)
类型转换(Type Conversion) 类型转换用于将一种数据类型的变量转换为另外一种类型的变,基本格式 type_name(expression) type_name 为类型,expressio ...
- flask与javascript及ajax
flask与javascript及ajax 1. flask+js 1.1. 最简单的 最简单的元素信息改变. {% block content %} <h1>我的第一张网 ...
- 【转】Django添加静态文件设置
STATIC_URL = '/statics/'STATIC_ROOT= os.path.join(BASE_DIR, 'statics')STATICFILES_DIRS = ( os.path.j ...
- 开源版本 hadoop-2.7.5 + apache-hive-2.1.1 + spark-2.3.0-bin-hadoop2.7整合使用
一,开源软件版本: hadoop版本 : hadoop-2.7.5 hive版本 :apache-hive-2.1.1 spark版本: spark-2.3.0-bin-hadoop2.7 各个版本到 ...
- ubuntu 关闭触控板
第一种: 1 sudo rmmod psmouse 这个是禁用的 2 sudo modprobe psmouse 这个是启用的 这个方法很便捷,但是会将触点和触板都禁用了,一般还是希望保持触点是 ...
- 【算法】 string 转 int
[算法] string 转 int 遇到的一道面试题, 当时只写了个思路, 现给出具体实现 ,算是一种比较笨的实现方式 public class StringToInt { /// <summa ...