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\)的网格上有字母,你每次可以沿平行坐标轴对折网格,要求对折的对应位置字母 ...
随机推荐
- Cyclic Nacklace 杭电3746
CC always becomes very depressed at the end of this month, he has checked his credit card yesterday, ...
- php+mysql数据库联合查询 left join 右侧数据重复问题
情况:多表联合查询(三表及以上联合查询) 分析: A left join B left join C left join D 假如: 表B.C.D都与表A关联查询 A left join B 4条数据 ...
- 初识phar反序列化&&复现bytectf_2019_easycms&&RSS思路
概要 来自Secarma的安全研究员Sam Thomas发现了一种新的漏洞利用方式,可以在不使用php函数unserialize()的前提下,引起严重的php对象注入漏洞.这个新的攻击方式被他公开在了 ...
- 接触 Jmeter
Apache JMeter是 Apache组织开发的基于 Java的开源压力测试工具.接口以及自动化测试. JMeter 可以进行参数化测试,实现自动化脚本与测试数据分离,能够对应用程序做功能/回归测 ...
- [linux][nginx] 通过nginx扩展nginx-rtmp-module简单做了一个流媒体直播
做的过程出现很多问题,环境其实就需要nginx就可以,然后就是在播放的问题,m3u8的格式,mac直接访问就支持,苹果系统原生H5支持m3u8,还有就是手机直接访问也支持!但是其他其他系统PC端不支持 ...
- PHP--关于上传文件大小的问题
参考:https://www.cnblogs.com/jianqingwang/p/5863960.html https://blog.csdn.net/u013168253/article/deta ...
- Inno Setup 大师 Tlama
https://stackoverflow.com/users/960757/tlama
- Task Scheduler Error Message: 80041318
Using the error lookup tool that comes with VC++ (errlook.exe, or "Error Lookup" on the To ...
- Spring Boot中的测试
文章目录 简介 添加maven依赖 Repository测试 Service测试 测试Controller @SpringBootTest的集成测试 Spring Boot中的测试 简介 本篇文章我们 ...
- 微软宣布一批新获得Microsoft Teams认证的会议硬件
COVID-19 疾病流行期间,微软见到了 Microsoft Teams 视频会议解决方案取得的巨大增长.然而在许多情况下,生产力与音视频硬件的质量息息相关.好消息是,该公司刚刚完成了一批第三方硬件 ...