题意

有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(哈希)的更多相关文章

  1. Codeforces Round #578 (Div. 2) E. Compress Words (双哈希)

    题目:https://codeforc.es/contest/1200/problem/E 题意:给你n个单词,你需要把他合成成一个句子,相邻的两个单词,相邻部分相同的话可以把其中一个的删掉 思路:因 ...

  2. 海量数据挖掘MMDS week2: 局部敏感哈希Locality-Sensitive Hashing, LSH

    http://blog.csdn.net/pipisorry/article/details/48858661 海量数据挖掘Mining Massive Datasets(MMDs) -Jure Le ...

  3. SHA-1(安全哈希算法实现)

    如题,不知道sha-1的自己百度吧. #include <iostream> #include <vector> //定义vector数组 #include <strin ...

  4. Linux Kernel(Android) 加密算法总结(一)(cipher、compress、digest)

    1. Linux内核支持哪些加密算法 ? 内核支持的加密算法非常多,包含: 对称加密算法.如AES,3DES. 对称password体制的发展趋势将以分组password为重点. 分组password ...

  5. [PHP内核探索]PHP中的哈希表

    在PHP内核中,其中一个很重要的数据结构就是HashTable.我们常用的数组,在内核中就是用HashTable来实现.那么,PHP的HashTable是怎么实现的呢?最近在看HashTable的数据 ...

  6. java单向加密算法小结(2)--MD5哈希算法

    上一篇文章整理了Base64算法的相关知识,严格来说,Base64只能算是一种编码方式而非加密算法,这一篇要说的MD5,其实也不算是加密算法,而是一种哈希算法,即将目标文本转化为固定长度,不可逆的字符 ...

  7. Java 哈希表运用-LeetCode 1 Two Sum

    Given an array of integers, find two numbers such that they add up to a specific target number. The ...

  8. 网络安全——Base64编码、MD5、SHA1-SHA512、HMAC(SHA1-SHA512)哈希

    据说今天520是个好日子,为什么我想起的是502.500.404这些?还好服务器没事! 一.Base64编码 Base64编码要求把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),之 ...

  9. Oracle 哈希连接原理

    <基于Oracle的sql优化>里关于哈希连接的原理介绍如下: 哈希连接(HASH JOIN)是一种两个表在做表连接时主要依靠哈希运算来得到连接结果集的表连接方法. 在Oracle 7.3 ...

随机推荐

  1. HiBench成长笔记——(9) Centos安装Maven

    Maven的下载地址是:http://maven.apache.org/download.cgi 安装Maven非常简单,只需要将下载的压缩文件解压就可以了. cd /home/cf/app wget ...

  2. 在 Linux 上实现一段时间后自动登出非活动用户

    参考 编辑 ~/.bashrc 或 ~/.bash_profile 文件: $ vi ~/.bashrc 或, $ vi ~/.bash_profile 将下面行加入其中: TMOUT=100 这会让 ...

  3. JS写一个漂亮的音乐播放器

    先放上效果图: 正如图中所展示的播放器那样,我们用HTML+CSS+JS将这个效果实现出来. HTML页面布局 <div class="music"> <div ...

  4. Java从.CSV文件中读取数据和写入

    .CSV文件是以逗号分割的数据仓储,读取数据时从每一行中读取一条数据元祖,也就是一条数据,再用字符分割的方式获取表中的每一个数据项. import java.io.BufferedReader;    ...

  5. Java的equals方法的使用技巧

    Java的equals方法的使用技巧 1.业务场景: 在某个社交软件中,要求每个用户的用户名(name)必须独一无二,那么在每次增加新用户的时候,都要对该用户的注册名进行判断,如果当前用户名已经被占用 ...

  6. net Core3.1 Swagger加JWT权限

    1.Swagger中开启JWT服务 #region swagger services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new ...

  7. ROS-1 : Ubuntu16.04中安装ROS Kinetic

    1.安装 ROS Kinetic仅支持Wily(Ubuntu 15.10).Xenial( Ubuntu16.04)和Jessie(Debian 8)的debian软件包. 1.1 配置Ubuntu ...

  8. 【剑指Offer】面试题32 - III. 从上到下打印二叉树 III

    题目 请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推. 例如: 给定二叉树: [3,9,20,nu ...

  9. POJ - 3468 A Simple Problem with Integers (线段树区间更新---间接修改)

    题意:区间add,区间求和. #include<cstdio> #include<cstring> #include<cstdlib> #include<cc ...

  10. Sublime和Python中文编码的一些问题

    Windows下的控制台中,应该是这样的逻辑: 1.如果是Unicode字符串的话,首先根据控制台编码进行转换 2.之后进行输出 所以在Windows控制台下,假设str = u'中文', 1.直接p ...