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\)的网格上有字母,你每次可以沿平行坐标轴对折网格,要求对折的对应位置字母 ...
随机推荐
- PHP函数:get_class()
get_class() -返回对象的类名 说明: get_class ([ object $object = NULL ] ) : string 参数: object:要测试的对象.如果在类里,此参 ...
- 重启mysql服务
重启mysql 启动mysql: 方式一:sudo /etc/init.d/mysql start 方式二:sudo service mysql start 停止mysql: 方式一:sudo /et ...
- [YII2] COOKIE的操作使用
PHPcookie的设置 setcookie('username',$data['username'],time()+3600*24*7); YII2cookie的设置 $cookies = Yii: ...
- python爬取优美图库海量图片,附加代码,一键爬取
优美高清图片为大家提供高清美女套图赏析,非高清不录入,大家的网速要给力. 今天教大家爬取优美图库网站中高质量的图片!! 简单易上手哦~ 使用工具: Python 3.6 pycharm 相关环境: r ...
- Django编写自定义manage.py 命令
官网文档地址:编写自定义 django-admin 命令 金句: 你所浪费的今天,正是昨天死的人所期待的明天. 开篇话: python manage.py <command> 的命令我们用 ...
- jQuery的attr和prop属性
<div id="div1"></div> attr: 首先是一个参数的attr. $("#div").attr("id&qu ...
- jeecg ant design vue 一些收藏
1关于 进来清除上次记录 找到src/permission.js下的
- synchronized 代码块怎么用
加不加 synchronized 有什么区别? synchronized 作为悲观锁,锁住了什么? 之前 2 篇文章我们已经知道 synchronized 的使用方法以及锁的内容(实例对象和Class ...
- liunx系统二进制包安装编译mysql数据库
liunx系统二进制包安装编译mysql数据库 # 解压二进制压缩包 [root@localhost ~]# tar xf mysql-5.5.32-linux2.6-x86_64.tar.gz -C ...
- 在同一个服务器上同时配置xxxxxxxxxx1个tomcat
下面我们把配置的详细过程写在下面,以供参考:(此例以配置三个Tomcat为例) 下载apache-tomcat-7.0.63,下载下来的文件为apache-tomcat-7.0.63.zip. 解压该 ...