链接:https://codeforces.com/contest/1200/problem/E

题意:依次合并两个单词,每次合并将删去最长相同前后缀,输出结果。

思路:用kmp跑出每个需要被连接的单词的next数组,与之前的单词进行匹配,跑出最长前后缀的长度并更新结果。

 #include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+;
int kmp[maxn];
char ans[maxn];
char b[maxn];
int main()
{
int T;
scanf("%d",&T);
T--;
scanf("%s",ans+);
int anslen=strlen(ans+);
while(T--){
scanf("%s",b+);
int len=strlen(b+);
kmp[]=kmp[]=;
int j=;
for(int i=;i<=len;i++){
while(j&&b[i]!=b[j+])
j=kmp[j];
if(b[j+]==b[i])j++;
kmp[i]=j;
}
j=;
for(int i=max(,anslen-len+);i<=anslen;i++){
while(j>&&b[j+]!=ans[i])
j=kmp[j];
if(b[j+]==ans[i])
j++;
}
int t=anslen;
for(int i=j+;i<=len;i++){
ans[++t]=b[i];
}
anslen=t;
}
for(int i=;i<=anslen;i++)
printf("%c",ans[i]);
printf("\n");
}

第二套代码

 #include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+;
int net[maxn];
int main()
{
ios::sync_with_stdio();
cin.tie();
string ans;
int n,ans_sz;
cin>>n>>ans;
for(int i=;i<n;i++){
string tmp; cin>>tmp;
int sz=tmp.size();
int p=; net[]=net[]=;
for(int i=;i<=sz;i++){
while(p&&tmp[i-]!=tmp[p]) p=net[p];
if(tmp[i-]==tmp[p]) p++;
net[i]=p;
}
p=; //最长相同前后缀长度
ans_sz=ans.size();
for(int i=max(,ans_sz-sz+);i<=ans_sz;i++){
while(p&&ans[i-]!=tmp[p]) p=net[p];
if(ans[i-]==tmp[p]) p++;
}
for(int i=p;i<sz;i++) ans+=tmp[i];
}
cout<<ans<<endl;
return ;
}

KMP算法例题的更多相关文章

  1. 给小白看的KMP算法

    浅谈KMP算法: (大部分人的KMP写法都是不一样的) 一: 先给大家推荐一个讲kmp特别好理解的一个博客:阮一峰 二: 再给大家介绍一点相关概念: 栗子:  P串: ABCBD 前缀:A,AB,AB ...

  2. 浅谈KMP算法

    一.介绍 烤馍片KMP算法是用来处理字符串匹配问题的.比如说给你两个字符串A,B,问B是不是A的子串? 比如,eg就是aeggx的子串 一般讲字符串A称为主串,用来匹配的B串称为模式串 定义n为字符串 ...

  3. 利用KMP算法解决串的模式匹配问题(c++) -- 数据结构

    题目: 7-1 串的模式匹配 (30 分) 给定一个主串S(长度<=10^6)和一个模式T(长度<=10^5),要求在主串S中找出与模式T相匹配的子串,返回相匹配的子串中的第一个字符在主串 ...

  4. 算法笔记--KMP算法 && EXKMP算法

    1.KMP算法 这个博客写的不错:http://www.cnblogs.com/SYCstudio/p/7194315.html 模板: next数组的求解,那个循环本质就是如果相同前后缀不能加上该位 ...

  5. KMP算法解释

    给定两个字符串A,B,判断T是否为S的子串(变式:寻找子串B在串A中的位置). 要求一个O(|A|+|B|)的做法. 通常称A为目标串(或主串),B为模式串. 算法过程: 我们假设串A的长度为n,串B ...

  6. 初涉KMP算法

    久仰字符串系列理论 KMP 讲解(引用自bzoj3670动物园) 某天,园长给动物们讲解KMP算法. 园长:“对于一个字符串S,它的长度为L.我们可以在O(L)的时间内,求出一个名为next的数组.有 ...

  7. kmp算法学习 与 传参试验(常回来看看)

    之前在codeforces上做了一道类似KMP的题目,但由于之前没有好好掌握,现在又基本忘记,并没能解答.下面是对KMP算法的一点小总结. 首先KMP算法的核心是纸在匹配过程中,利用模式串的前后缀来加 ...

  8. 字符串专题之KMP算法

    写点自己对KMP的理解,我们有两个字符串A和B,求A中B出现了多少次. 这种问题就可以用KMP来求解. 朴素的匹配最坏情况是O(n^2)的.KMP是个高效的算法,效率是O(n)的. KMP算法的思想是 ...

  9. AC自动机算法 && 例题

    参考链接: https://blog.csdn.net/bestsort/article/details/82947639#commentBox https://blog.csdn.net/niush ...

随机推荐

  1. tensorflow模型的保存与加载

    模型的保存与加载一般有三种模式:save/load weights(最干净.最轻量级的方式,只保存网络参数,不保存网络状态),save/load entire model(最简单粗暴的方式,把网络所有 ...

  2. 使用这7个隐藏技巧让您的Mac更易于阅读和使用!

    macOS Mojave(10.15)可以说是苹果公司功能最强大,功能最强大的现代Mac软件更新版.它带来了一系列新功能,安全和隐私控制,稳定性增强以及Dark Mode主题! 它也代表了最易于使用的 ...

  3. python的优先级

    在编写程序时,我遇到麻烦!怎么找都找不到bug 最终我发现了是我搞错了运算符优先级 位运算要在加减后面(这可真奇怪) eg 10-10^11=11!!! 还是多加括号的好

  4. Java锁机制深入理解

    Java锁机制 背景知识 指令流水线 ​ CPU的基本工作是执行存储的指令序列,即程序.程序的执行过程实际上是不断地取出指令.分析指令.执行指令的过程. ​ 几乎所有的冯•诺伊曼型计算机的CPU,其工 ...

  5. react-native构建基本页面6---打包发布

    签名打包发布Release版本的apk安装包 请参考以下两篇文章: ReactNative之Android打包APK方法(趟坑过程) React Native发布APP之签名打包APK 如何发布一个a ...

  6. 假期学习【十一】Python爬取百度词条写入csv格式 python 2020.2.10

    今天主要完成了根据爬取的txt文档,从百度分类从信息科学类爬取百度词条信息,并写入CSV格式文件. txt格式文件如图: 为自己爬取内容分词后的结果. 代码如下: import requests fr ...

  7. 搜索字母a或A

    Amy觉得英语课实在是无聊至极,他不喜欢听老师讲课. 但是闲着也是闲着,不如做点什么吧?于是他开始数英语书里的字母a和A共出现了多少次. 费了九牛二虎之力终于数完了. 作为一名软件工程专业大学生,他觉 ...

  8. ReportViewer Win32Exception (0x80004005): 创建窗口句柄时出错

    System.ComponentModel.Win32Exception (0x80004005): 创建窗口句柄时出错. 在 System.Windows.Forms.NativeWindow.Cr ...

  9. LED Holiday Light-5 Mm Wide Angle Cone Lights: Pros

    But in rare cases, the opposite is true: the opinions of consultants are so synchronized that it is ...

  10. .net Core 安装在linux上

    1.安装 .net Core 参考官方网站 https://dotnet.microsoft.com/learn/dotnet/hello-world-tutorial/install 2.发布应用程 ...