原题

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

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

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

  2. codeforces 633C. Spy Syndrome 2 hash

    题目链接 C. Spy Syndrome 2 time limit per test 2 seconds memory limit per test 256 megabytes input stand ...

  3. Codeforces 633C Spy Syndrome 2(DP + Trie树)

    题目大概说给一个加密的字符串,加密规则是把原文转化成小写字母,然后各个单词反转,最后去掉空格.现在给几个已知的单词,还原加密的字符串. 和UVa1401一个道理.. 用dp[i]表示加密字符前i个字符 ...

  4. Codeforces 633C Spy Syndrome 2 【Trie树】+【DFS】

    <题目链接> 题目大意:给定一个只有小写字母组成的目标串和m个模式串(里面可能有大写字母),记目标串反过来后的串为S,让你从m个模式串中选出若干个组成S串(不区分大小写).输出任意一种方案 ...

  5. CF#633C Spy Syndrome 2 DP+二分+hash

    Spy Syndrome 2 题意 现在对某个英文句子,进行加密: 把所有的字母变成小写字母 把所有的单词反过来 去掉单词之间的空格 比如:Kira is childish and he hates ...

  6. Codeforce 633C. Spy Syndrome 2

    C. Spy Syndrome 2 time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...

  7. Manthan, Codefest 16 C. Spy Syndrome 2 字典树 + dp

    C. Spy Syndrome 2 题目连接: http://www.codeforces.com/contest/633/problem/C Description After observing ...

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

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

  9. 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 ...

随机推荐

  1. php 操作RabbitMQ

    本文摘抄自:https://www.cnblogs.com/alin-qu/p/8312874.html php 操作RabbitMQ   基本流程图 如果exchange 没有绑定queue,则消息 ...

  2. YII2 多MongoDB配置和使用

    1:在config/web.php 文件下配置多个连接即可: 注意在componets 下 'mongodb' => [ 'class' => '\yii\mongodb\Connecti ...

  3. 数据分析处理库Pandas——时间

    时间戳 向后推的时间戳 备注:五天后的时间. 指定日期和时间 时间的Series结构 按要求显示时间(开始时间,时间间隔,时间个数) 转换为时间格式,并设置时间列为索引列 方法一 方法二 筛选显示 方 ...

  4. python查询mysql数据

    >>>cur.execute("select * from 表名") >>>lines=cur.fetchall() >>>f ...

  5. 网站如何防止sql注入攻击的解决办法

    首先我们来了解下什么是SQL注入,SQL注入简单来讲就是将一些非法参数插入到网站数据库中去,执行一些sql命令,比如查询数据库的账号密码,数据库的版本,数据库服务器的IP等等的一些操作,sql注入是目 ...

  6. JAVA 反射之Method

    ★ Method没有构造器,只能通过Class获取. 重点方法: class.getDeclaredMethods():获取所有方法. class.getDeclaredMethod(String n ...

  7. POJ1679(次小生成树)

    The Unique MST Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 36692   Accepted: 13368 ...

  8. JAVA多进程入门

    概念 并行和并发 并行:物理上的实现,在同一时间点上发生 并发:两个事件在一个时间段内发生,如单片机的单核多线程 进程和线程 进程:一个应用程序可以有多个进程,每一个进程有一个独立的内存空间 线程:一 ...

  9. c# string.format和tostring()

    字符 说明 示例 输出 C 货币 string.Format("{0:C3}", 2) $2.000 D 十进制 string.Format("{0:D3}", ...

  10. 源码解析:解析掌阅X2C 框架

    前言 掌阅出品了X2C 框架,听说可以加快性能.喜欢研究源码的我,肯定要来看下是怎么回事. 作为一个开发,应该不屑于只会使用开源框架. OK,来尝试下. 项目地址: https://github.co ...