题意:

给你若干个字符串,答案串初始为空。第 iii 步将第 iii 个字符串加到答案串的后面,但是尽量地去掉重复部分(即去掉一个最长的、是原答案串的后缀、也是第 iii个串的前缀的字符串),求最后得到的字符串。
字符串个数不超过 10510^5105,总长不超过 10610^6106

题目:

Amugae has a sentence consisting of n words. He want to compress this sentence into one word. Amugae doesn’t like repetitions, so when he merges two words into one word, he removes the longest prefix of the second word that coincides with a suffix of the first word. For example, he merges “sample” and “please” into “samplease”.

Amugae will merge his sentence left to right (i.e. first merge the first two words, then merge the result with the third word and so on). Write a program that prints the compressed word after the merging process ends.

Input

The first line contains an integer n (1≤n≤105), the number of the words in Amugae’s sentence.

The second line contains n words separated by single space. Each words is non-empty and consists of uppercase and lowercase English letters and digits (‘A’, ‘B’, …, ‘Z’, ‘a’, ‘b’, …, ‘z’, ‘0’, ‘1’, …, ‘9’). The total length of the words does not exceed 106.

Output

In the only line output the compressed word after the merging process ends as described in the problem.

Examples
Input

5
I want to order pizza

Output

Iwantorderpizza

Input

5
sample please ease in out

Output

sampleaseinout

分析:

KMP:从第二个开始字符串开始和前面合并的子串进行kmp算法
注意每次匹配的起点位置,应该为 文本串长度-模式串长度
哈希:每次需要求最长的、是原答案串的后缀、也是第 iii个串的前缀的字符串。枚举这个串的长度,哈希比较即可。

AC代码:

KMP:

#include<bits/stdc++.h>
using namespace std;
const int M=1e6+10;
string a,b;
int nx[M];
int len,l2;void getnext()
{int k = -1, j = 0;nx[0] = -1;while(j<l2){if(k==-1||b[j]==b[k])nx[++j]=++k;elsek=nx[k];}
}
int KMP(int st)
{int i=st,j=0;getnext();while(i<len){if(j==-1 || a[i]==b[j]) ++i,++j;else j=nx[j];}return j;
}int main()
{int t;scanf("%d",&t);cin>>a;len=a.size();int pos=0;for(int i=1; i<t; i++){cin>>b;l2=b.size();int x=KMP(max(pos-l2,0));for(int i=x; i<l2; i++){a.push_back(b[i]);len++;}pos=len;}cout<<a<<endl;
}

哈希

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;const int N=1e6+10;ll mo[3]={(ll)1e9+21,(ll)1e9+9,(ll)1e9+7};
ll ba[3]={233,223,23};
ll p[3][N];
ll ha[3][N];
void init(){p[0][0]=p[1][0]=p[2][0]=1;for(int i=1; i<N; ++i){p[0][i]=(p[0][i-1]*ba[0])%mo[0];p[1][i]=(p[1][i-1]*ba[1])%mo[1];p[2][i]=(p[2][i-1]*ba[2])%mo[2];}
}
ll cal(int x,int l,int r){ll tp=(ha[x][r]-ha[x][l-1]*p[x][r-l+1])%mo[x];return (tp+mo[x])%mo[x];
}char c1[N],c2[N];
int getsr(int x,int n){int sr=1;ll d1=0,d2=0,d3=0;for(int i=n,j=1; i>=x; --i,++j){d1=(d1*ba[0]+c2[j])%mo[0];d2=(d2*ba[1]+c2[j])%mo[1];d3=(d3*ba[2]+c2[j])%mo[2];if(cal(0,i,n)==d1 && cal(1,i,n)==d2 && cal(2,i,n)==d3){sr=j+1;}}return sr;
}int main()
{init();int n;scanf("%d %s",&n,c1+1);int len=strlen(c1+1);for(int i=1; i<=len; ++i){ha[0][i]=(ha[0][i-1]*ba[0]+c1[i])%mo[0];ha[1][i]=(ha[1][i-1]*ba[1]+c1[i])%mo[1];ha[2][i]=(ha[2][i-1]*ba[2]+c1[i])%mo[2];}for(int i=1; i<n; ++i){scanf("%s",c2+1);int t1=strlen(c2+1);int sr=getsr(max(len-t1+1,1),len);for(int i=sr; i<=t1; ++i){++len;c1[len]=c2[i];ha[0][len]=(ha[0][len-1]*ba[0]+c1[len])%mo[0];ha[1][len]=(ha[1][len-1]*ba[1]+c1[len])%mo[1];ha[2][len]=(ha[2][len-1]*ba[2]+c1[len])%mo[2];}}printf("%s\n",c1+1);return 0;
}

KMP模式串匹配+Compress Words CodeForces - 1200E相关推荐

  1. 模式串匹配的BF算法和KMP算法

    KMP是三位大牛:D.E.Knuth.J.H.Morris和V.R.Pratt同时发现的.为了解决模式匹配问题,也即寻找模式串(子串)在主串中第一次出现的位置,若模式串在主串中不存在则返回-1. 简单 ...

  2. 《数据结构》—— 串,KMP模式算法(转载)

    本文内容转载自: KMP 算法(1):如何理解 KMP KMP 算法(2):其细微之处 一:背景展开目录 给定一个主串(以 S 代替)和模式串(以 P 代替),要求找出 P 在 S 中出现的位置,此即 ...

  3. AC自动机:多模式串匹配实现敏感词过滤

    文章出处:极客时间<数据结构和算法之美>-作者:王争.该系列文章是本人的学习笔记. 1 敏感词过滤场景 在很多支持用户发表内容的网站,都有敏感词过滤替换的功能.例如将一些淫秽.反动内容过滤 ...

  4. 串--串的定义,顺序、链式存储结构,BF、KMP模式匹配算法(C语言描述)

    此文章仅作为自己学习过程中的记录和总结,同时会有意地去用英文来做笔记,一些术语的英译不太准确,内容如有错漏也请多指教,谢谢! 一.串(String)的定义: 串(String):由零个或多个字符组成的 ...

  5. 也许,你可以像我这样来理解KMP模式匹配算法

    本文已在本人微信公众号"码农小阿飞"上发布,打开微信搜索"码农小阿飞",或者扫描文章结尾的二维码,进入公众号并关注,就可以在第一时间收到我的推文! 前言 不管是 ...

  6. java中KMP模式_朴素模式匹配算法、kmp模式匹配算法、kmp模式匹配算法改进。java代码...

    ** 朴素模式匹配算法.kmp模式匹配算法.kmp模式匹配算法改进.java代码** 思路过段时间整理~ 可以先看看阮一峰的这篇博客,字符串匹配的KMP算法 package edu.hubu.base ...

  7. C/C++——朴素的模式匹配算法和KMP模式匹配算法

    朴素的模式匹配算法 其实就是一个一个往下匹配,没有任何优化,在好的情况下时间复杂度为O(n+m),在最求的情况下时间复杂度为O((n-m+1)*m). 代码实现: //在主串s中找子串t,若找到返回字 ...

  8. 线性表-串:KMP模式匹配算法

    一.简单模式匹配算法(略,逐字符比较即可) 二.KMP模式匹配算法 next数组:j为字符序号,从1开始. (1)当j=1时,next=0: (2)当存在前缀=后缀情况,next=相同字符数+1: ( ...

  9. 落谷 P3375 【模板】KMP字符串匹配

    题目描述 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来还要输出子串的前缀数组next. 输入格式: 第一行为一个字符串,即为s1 ...

最新文章

  1. 面试碰到这个算法:字母异位词分组
  2. python爬图片 beautifulsoup_【Python爬虫】基于BeautifulSoup的微博图片爬虫
  3. 应用程序创建自己的奔溃转储(crash dump)文件
  4. 每天进步一点点013
  5. 有关坐标系常见问题的问与答(转自ESRI中国社区)
  6. JQuery22( JQ原理 Clone)
  7. 停车还能360全方位影像_辅助停车,新手司机就选360全景吧!
  8. 《人性的弱点》(戴尔-卡耐基)读书小结
  9. Python 爬虫 爬取 煎蛋网 图片
  10. node.js+uniapp计算机毕业设计安卓在线民宿预定app(程序+APP+LW)
  11. 1u服务器系统风扇,1U工控服务器机箱介绍
  12. 怎么将两段视频合并在一起?快速操作技巧
  13. 在 Beagleboard-x15 上配置 spi 和 GPIO
  14. bp神经网络推导以及物理意义
  15. 一名Java大佬跳槽之旅,离开京东,14面面试经验和收获
  16. unity应用实例——从头撸一个全新的FPS游戏(1)
  17. 想成为“独立名师”,你还要做到哪几点?
  18. Array方法、String方法
  19. ZCMU 1411 喜闻乐见的a+b
  20. 2014年十大发展前景比较好的行业

热门文章

  1. ENVI IDL读写数据
  2. 【C语言简单说】六:取模运算符以及变量的扩展
  3. 嵌入式开发linux工具,嵌入式Linux开发入门之MfgTool工具的使用
  4. python 运算符重载_Python3面向对象-运算符重载
  5. 身家4400亿美元的他,吃低于3美元的早餐,和2个老婆同居28年!
  6. 当你死后尸体如何处理?两种新玩法了解一下!
  7. 从一个骗局谈生活中的基础算法
  8. 近期资料分享汇总,还不快来看看你漏了哪份没拿?
  9. 梯度下降法、随机梯度下降法、批量梯度下降法及牛顿法、拟牛顿法、共轭梯度法
  10. mysql集群从节点无法启动_一次galera cluster集群故障节点无法启动问题排查