CF#633C Spy Syndrome 2 DP+二分+hash
Spy Syndrome 2
题意
现在对某个英文句子,进行加密:
- 把所有的字母变成小写字母
- 把所有的单词反过来
- 去掉单词之间的空格
比如: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的更多相关文章
- 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 ...
- Codeforce 633C. Spy Syndrome 2
C. Spy Syndrome 2 time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...
- Codeforces 633C Spy Syndrome 2(DP + Trie树)
题目大概说给一个加密的字符串,加密规则是把原文转化成小写字母,然后各个单词反转,最后去掉空格.现在给几个已知的单词,还原加密的字符串. 和UVa1401一个道理.. 用dp[i]表示加密字符前i个字符 ...
- SYZOJP186 你猜猜是不是DP 二分+hash解法
SYZOJP186 你猜猜是不是DP题解 题目传送门 现在给两个仅包含小写字母的字符串a,b ,求a 与b的最长公共连续子串的长度. 对于20%的数据,a,b长度 ∈ [1, 200] 对于50%的数 ...
- [codeforces] 633C Spy Syndrome 2
原题 Trie树+dp 首先,我们可以简单的想到一种dp方式,就是如果这一段可以匹配并且可以与前一段接上,那么更新dp[i]为当前字符串的编号,然后倒推就可以得到答案. 但是,显然我们不能O(m)比较 ...
- Codeforces 633C Spy Syndrome 2 【Trie树】+【DFS】
<题目链接> 题目大意:给定一个只有小写字母组成的目标串和m个模式串(里面可能有大写字母),记目标串反过来后的串为S,让你从m个模式串中选出若干个组成S串(不区分大小写).输出任意一种方案 ...
- Manthan, Codefest 16 C. Spy Syndrome 2 字典树 + dp
C. Spy Syndrome 2 题目连接: http://www.codeforces.com/contest/633/problem/C Description After observing ...
- YbtOJ#526-折纸游戏【二分,hash】
正题 题目链接:https://www.ybtoj.com.cn/problem/526 题目大意 一个\(n\times m\)的网格上有字母,你每次可以沿平行坐标轴对折网格,要求对折的对应位置字母 ...
随机推荐
- O - Navigation System CodeForces - 1321D
题目大意:有一个导航系统,会根据你当前的位置,规划到目的地的最短路线,给你一个有向图,和一条行驶路径,问你导航重新规划路径的最大次数和最小次数. 读题的时候题意特别不理解,何为最大次数,何为最小次数? ...
- D - Yet Another Monster Killing Problem
题目连接: https://codeforces.com/contest/1257/problem/D 题目大意: n个怪兽,m个英雄,每个怪兽有一定的能力值,每个英雄有一定的能力值和一定的耐力值.耐 ...
- JSP中引用CSS样式文件却无法显示的问题解决方案
你也遇到过这种问题吗,CSS写好了,JSP写好了,在JSP中调用CSS文件,路径检查后也正确,但是无法显示渲染后的页面 原因:罪魁祸首就是过滤器响应数据的时候,响应头设置为了“text/html”,但 ...
- PHP 新特性:如何善用接口与Trait
首先! 接口也可以继承,通过使用 extends 操作符. 案例: <?php interface a { public function foo(); } interface b extend ...
- 2019-2020-1 20199325《Linux内核原理与分析》第十二周作业
什么是ShellShock? Shellshock,又称Bashdoor,是在Unix中广泛使用的Bash shell中的一个安全漏洞,首次于2014年9月24日公开.许多互联网守护进程,如网页服务器 ...
- ubuntu server 18.04 网络配置
从17.10开始放弃在/etc/network/interfaces里固定IP的配置 配置文件是:/etc/netplan/50-cloud-init.yaml .用缩进来表示层级关系 冒号之后要有个 ...
- Linux hostname主机名查看和设置
查询主机名: uname -n hostname [root@oldboy ~]# uname -n oldboy [root@oldboy ~]# hostname oldboy Linux操作系统 ...
- WLAN 无线网络 03 - RF 基础
射频(Radio frequency),又称无线电频率.无线射频.高周波,常被用来当成无线电的同义词,为在3 kHz至300 GHz这个范围内的震荡频率,这个频率相当于无线电波的频率,以及携带着无线电 ...
- 【kafka KSQL】游戏日志统计分析(1)
[kafka KSQL]游戏日志统计分析(1) 以游戏结算日志为例,展示利用KSQL对日志进行统计分析的过程. 启动confluent cd ~/Documents/install/confluent ...
- Flask中可以利用Flask-SQLAlchemy
为什么80%的码农都做不了架构师?>>> 官方文档:http://flask-sqlalchemy.pocoo.org/2.3/ 1.安装(进入虚拟环境)--利用镜像安装PyMy ...