cf1200 E Compress Words(哈希)
题意
有n个字符串,记为s1,s2……sn,s2与s1合并,合并的方式为:s1的后缀若与s2的前缀相同,就可以重叠起来,要最长的。
举个例子:
“1333” “33345” → “133345”
s1与s2合并后产生的字符串,再与s3合并,以此类推。
思路
两个字符串的子串匹配,比较容易想到哈希。
一开始想的是从左往右哈希,就是:“123” → 123,但是这样哈希的话,若要更新字符串(就是在末尾添加字符),那么前面每个位置的哈希值都要变,复杂度爆炸。
那就试试从右往左哈希,就是:“123” → 321,这样要在末尾添加字符的时候,前面的哈希值不会变,很好更新。
然后,我们就可以记录当前字符串的最后一个字符是什么,然后遍历下一个要合并进来的字符串,当遇到和末尾相同的字符时,就可以哈希看看能否匹配。
代码
#include <stdio.h>
#include <queue>
#include <string>
#include <string.h>
#include <algorithm>
#include <math.h>
using namespace std;
typedef long long int ll;
const int maxn = 1e6 + ;
const ll inf = 0x3f3f3f3f;
const ll mod = 1e9 + ;
const ll seed = ;
char s[maxn],t[maxn];
ll sval[maxn],tval[maxn],fac[maxn];
int main()
{
int n,lens,lent;
char tail;
fac[] = ;
for(int i = ;i < maxn;i++){
fac[i] = (fac[i - ] * seed) % mod;
}
while(scanf("%d",&n) != EOF){
scanf("%s",s + );
lens = strlen(s + );
sval[] = ;
for(int i = ;i <= lens;i++){
sval[i] = (((s[i] - '') * fac[i - ]) % mod + sval[i - ]) % mod;
}
tail = s[lens];
n--;
ll now = ,pos = ;
while(n--){
now = pos = ;
scanf("%s",t + );
lent = strlen(t + );
for(int i = ;i <= lent;i++){
if(i > lens)
break;
now = (((t[i] - '') * fac[i - ]) % mod + now) % mod;
if(t[i] == tail){
if((now * fac[lens - i]) % mod == ((sval[lens] - sval[lens - i]) % mod + mod) % mod){
pos = i;
}
}
} for(int i = pos + ;i <= lent;i++){
sval[lens + ] = (((t[i] - '') * fac[lens]) % mod + sval[lens]) % mod;
lens++;
s[lens] = t[i];
}
tail = s[lens];
}
s[lens + ] = ;
printf("%s\n",s + );
}
return ;
}
cf1200 E Compress Words(哈希)的更多相关文章
- Codeforces Round #578 (Div. 2) E. Compress Words (双哈希)
题目:https://codeforc.es/contest/1200/problem/E 题意:给你n个单词,你需要把他合成成一个句子,相邻的两个单词,相邻部分相同的话可以把其中一个的删掉 思路:因 ...
- 海量数据挖掘MMDS week2: 局部敏感哈希Locality-Sensitive Hashing, LSH
http://blog.csdn.net/pipisorry/article/details/48858661 海量数据挖掘Mining Massive Datasets(MMDs) -Jure Le ...
- SHA-1(安全哈希算法实现)
如题,不知道sha-1的自己百度吧. #include <iostream> #include <vector> //定义vector数组 #include <strin ...
- Linux Kernel(Android) 加密算法总结(一)(cipher、compress、digest)
1. Linux内核支持哪些加密算法 ? 内核支持的加密算法非常多,包含: 对称加密算法.如AES,3DES. 对称password体制的发展趋势将以分组password为重点. 分组password ...
- [PHP内核探索]PHP中的哈希表
在PHP内核中,其中一个很重要的数据结构就是HashTable.我们常用的数组,在内核中就是用HashTable来实现.那么,PHP的HashTable是怎么实现的呢?最近在看HashTable的数据 ...
- java单向加密算法小结(2)--MD5哈希算法
上一篇文章整理了Base64算法的相关知识,严格来说,Base64只能算是一种编码方式而非加密算法,这一篇要说的MD5,其实也不算是加密算法,而是一种哈希算法,即将目标文本转化为固定长度,不可逆的字符 ...
- Java 哈希表运用-LeetCode 1 Two Sum
Given an array of integers, find two numbers such that they add up to a specific target number. The ...
- 网络安全——Base64编码、MD5、SHA1-SHA512、HMAC(SHA1-SHA512)哈希
据说今天520是个好日子,为什么我想起的是502.500.404这些?还好服务器没事! 一.Base64编码 Base64编码要求把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),之 ...
- Oracle 哈希连接原理
<基于Oracle的sql优化>里关于哈希连接的原理介绍如下: 哈希连接(HASH JOIN)是一种两个表在做表连接时主要依靠哈希运算来得到连接结果集的表连接方法. 在Oracle 7.3 ...
随机推荐
- springboot 中单机 redis 实现分布式锁
在微服务中经常需要使用分布式锁,来执行一些任务.例如定期删除过期数据,在多个服务中只需要一个去执行即可. 以下说明非严格意义的分布式锁,因为 redis 实现严格意义的分布式锁还是比较复杂的,对于日常 ...
- Vue父组件向子组件传值
父组件向子组件传值 组件实例定义方式,注意:一定要使用props属性来定义父组件传递过来的数据 <script> // 创建 Vue 实例,得到 ViewModel var vm = ne ...
- .net 4.0 : Missing compiler required member 'Microsoft.CSharp.RuntimeBinder.Binder.****'
解决办法,添加 MicroSoft.CSharp 的引用.
- delphi关闭和禁用Windows服务
function StopServices(const SvrName: string): Boolean; var SCH, SvcSCH: SC_HANDLE; SS: TServiceStatu ...
- 吴裕雄--天生自然java开发常用类库学习笔记:比较器
class Student implements Comparable<Student> { // 指定类型为Student private String name ; private i ...
- redis.conf文件配置
最重要三个配置 1. bind 127.0.0.1 需要注释掉这一行,使别的主机可以访问 2. daemonize no 需要改为yes,使其后台运行 3. requirepass foobared ...
- go语言开发环境安装及第一个go程序
下载Go语言开发包 大家可以在Go语言官网(https://golang.google.cn/dl/)下载 Windows 系统下的Go语言开发包,如下图所示. 安装Go语言开发包 双击我们下载好的G ...
- 三十四、在SAP的屏幕选择中,将英文替换成我们想要的文本内容
一.我们在代码中定义了一个选择屏幕,但是对应的显示界面为英文 界面如下 二.我们选择[转到]-[文本元素] 三.默认的文本内容是问号和三个点 四.我们修改成我们需要的,并激活这个文本,如果不激活会丢失 ...
- C# 并行线程调用
参考 一.异步委托开启线程 Action<int, int> a = add; a.BeginInvoke(, , null, null);//前两个是add方法的参数,后两个可以为空 C ...
- 配置gem5-gpu模拟环境
// 系统:ubuntu 14.04,显卡:支持CUDA的显卡.建议换aliyun的源!先clean软件源再update.// 在Ubuntu 16.04上试过,配好环境变量,编译出错(把14.04上 ...