Spy Syndrome 2

题意

现在对某个英文句子,进行加密:

  1. 把所有的字母变成小写字母
  2. 把所有的单词反过来
  3. 去掉单词之间的空格

比如:Kira is childish and he hates losing

加密为ariksihsidlihcdnaehsetahgnisol

现在给出加密后的句子,以及m个单词(每个单词可以重复使用),输出原来的句子。

思路

使用dp[i]表示第i个字母作为句子最后一个单词的开头所在的单词编号。

dp值为0表示不能组成句子。

对于每个单词hash一下,按照每个单词的hash值从小到大排序。

遍历加密后的句子,对于每个i,往前寻找第一个j使得[i,j]为一个单词(最多1000次,单词长度最大为1000),纪录这个单词的编号。

对于每一个j,使用二分判断所有的单词中是否存在当前的hash值,如果存在那么[i,j]就是一个合法的单词。

如果dp[j-1]==0,说明第j-1个字符作为最后一个单词的开头不合法,那么[i,j]作为一个单词肯定不合法,跳过。

然后DFS输出一下。

这个思路我就是莽一发,竟然没超时685ms

正解好像是字典树+dfs,不过字典树还没学。

代码

#include<bits/stdc++.h>
#define pb push_back
using namespace std;
typedef long long ll;
const int N=1e5+10;
const int mod=1e9+7;
const int inf=0x3f3f3f3f; int dp[N];
char s[N];
struct note
{
int id,val;
char s[1010];
bool operator <(const note&a) const
{
return val<a.val;
}
} arr[N],now;
bool cmp(note a,note b)
{
return a.id<b.id;
}
void dfs(int pos)
{
if(pos==0) return ;
int len=strlen(arr[dp[pos]].s);
dfs(pos-len);
for(int i=0; i<len; i++)
printf("%c",arr[dp[pos]].s[i]);
printf(" ");
}
int main()
{
int lens;
scanf("%d%s",&lens,s+1);
int m;
scanf("%d",&m);
for(int i=1; i<=m; i++)
{
arr[i].val=0;
scanf("%s",arr[i].s);
arr[i].id=i;
int lent=strlen(arr[i].s);
for(int j=0; j<lent; j++)//计算当前单词的hash值
{
int tmp=arr[i].s[j]-'a'+1;
if(arr[i].s[j]>='A'&&arr[i].s[j]<='Z')
tmp+=32;
arr[i].val=(arr[i].val*26%mod+tmp)%mod;
}
}
sort(arr+1,arr+1+m);
dp[0]=1;
for(int i=1; i<=lens; i++)
{
int tmp=0;
for(int j=i; j>max(0,i-1000); j--)//最多遍历1000位
{
tmp=(tmp*26%mod+(s[j]-'a'+1))%mod;
if(!dp[j-1]) continue;//如果dp[j-1]不能组成句子,当前位没有继续的必要
now.val=tmp;
int pos=(int)(lower_bound(arr+1,arr+1+m,now)-arr);
if(pos!=m+1&&arr[pos].val==tmp)
{
dp[i]=arr[pos].id;//纪录单词编号
break;
}
}
}
sort(arr+1,arr+1+m,cmp);
dfs(lens);
printf("\n");
return 0;
}
/*
7
ihereht
3
HI
Ho
there
*/

CF#633C Spy Syndrome 2 DP+二分+hash的更多相关文章

  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. Codeforce 633C. Spy Syndrome 2

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

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

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

  5. SYZOJP186 你猜猜是不是DP 二分+hash解法

    SYZOJP186 你猜猜是不是DP题解 题目传送门 现在给两个仅包含小写字母的字符串a,b ,求a 与b的最长公共连续子串的长度. 对于20%的数据,a,b长度 ∈ [1, 200] 对于50%的数 ...

  6. [codeforces] 633C Spy Syndrome 2

    原题 Trie树+dp 首先,我们可以简单的想到一种dp方式,就是如果这一段可以匹配并且可以与前一段接上,那么更新dp[i]为当前字符串的编号,然后倒推就可以得到答案. 但是,显然我们不能O(m)比较 ...

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

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

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

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

  9. YbtOJ#526-折纸游戏【二分,hash】

    正题 题目链接:https://www.ybtoj.com.cn/problem/526 题目大意 一个\(n\times m\)的网格上有字母,你每次可以沿平行坐标轴对折网格,要求对折的对应位置字母 ...

随机推荐

  1. selenium 元素定位常用的方法

    元素定位的方法有2个 driver.findElement(By.args) 返回值是WebElement            //此方法是获取单一的页面元素 driver.findElements ...

  2. Python大数据与机器学习之NumPy初体验

    本文是Python大数据与机器学习系列文章中的第6篇,将介绍学习Python大数据与机器学习所必须的NumPy库. 通过本文系列文章您将能够学到的知识如下: 应用Python进行大数据与机器学习 应用 ...

  3. .NET Core 3 WPF MVVM框架 Prism系列之对话框服务

     本文将介绍如何在.NET Core3环境下使用MVVM框架Prism的对话框服务,这也是prism系列的最后一篇完结文章,下面是Prism系列文章的索引: .NET Core 3 WPF MVVM框 ...

  4. 2019-2020-1 20199326《Linux内核原理与分析》第七周作业

    实验内容:分析Linux内核创建一个新进程的过程 初始化Menu Os,输入fork可以看到menuos触发了一个fork系统调用 再开一个shell,进入调试模式,设置几个断点sys_clone,d ...

  5. char * 转 wchar *

    ) ) https://github.com/ffftp/ffftp/commit/0b1ea7a23dc6c72d519edbdeb30f48b3c7c8e867

  6. BareTail 观看文件增加的工具

  7. 快速上手最新的 Vue CLI 3

    翻译:疯狂的技术宅 原文:blog.logrocket.com/getting-sta- 概要:本文将指导你快速上手 Vue CLI 3,包括最新的用户图形界面和即时原型制作功能的使用步骤. 介绍 尤 ...

  8. Microsoft Dynamics CRM 2015 服务器系统的性能维护,追踪, 也可以用到任务管理器哟...

    Microsoft Dynamics CRM 2015 的追踪是一个很有用的function,它能为我们的CRM调试,评估 提供有价值的信息:我们可以用window的性能监控工具来了解CRM的性能状态 ...

  9. 在sun jdk 8镜像基础上构建maven 3的docker镜像

    2019独角兽企业重金招聘Python工程师标准>>> 在https://my.oschina.net/ytqvip/blog/1595054文章的sun jdk 8镜像基础上构建m ...

  10. Muduo网络库实战(一):安装和配置

    1. 参考资料 <Muduo_网络库使用手册> 2. 实战记录 1) muduo依赖项安装 centos安装cmake命令:# yum install cmake centos安装libb ...