链接: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. 剑指offer-面试题17-打印从1到最大的n位数-数字

    /* 题目: 输入数字n,按顺序打印从1到最大的n位十进制数. 如输入3,打印从1,2,3到999. */ /* 思路: 大数问题转化为字符串或数组. */ #include<iostream& ...

  2. 在eclipse更新启动项目

    说明:figfree是基于模块化开发,代码重用,可拆解性高. 功能模块分为:接口工程(*.Iface).接口实现工程(*.Impl).客户端工程(*.Client) 接口工程(*.Iface):对其他 ...

  3. 树hash/树哈希 刷题记录

    不同hash姿势: 树的括号序列最小表示法  s[i] 如果i为叶子节点:() 如果i的子节点为j1~jn:(s[j1]...s[jn]),注意s[j]要按照字典序排列

  4. PTA 1001 A+B Format

    问题描述: Calculate a+b and output the sum in standard format -- that is, the digits must be separated i ...

  5. IDEA 找不到包或者找不到符号的一些解决办法

    有时使用IDE导入项目后,启动时会发生找不到包或者找不到符号的情况,下面有一些处理方法 1.右键项目Maven→Reimport 2.IDEA窗口左上角File→Invalidate and Rest ...

  6. 自主开发编程语言被指Python套壳,中科院开发者道歉

    中科院计算所团队“完全自主设计.开发和实现”的“木兰”编程语言是Python语言的套壳产品?针对近日这一网络质疑,1月17日,项目负责人.中科院计算所编译实验室员工刘雷在科学网上发表回应称,木兰语言在 ...

  7. [转]从实例谈OOP、工厂模式和重构

    有了翅膀才能飞,欠缺灵活的代码就象冻坏了翅膀的鸟儿.不能飞翔,就少了几许灵动的气韵.我们需要给代码带去温暖的阳光,让僵冷的翅膀重新飞起来.结合实例,通过应用OOP.设计模式和重构,你会看到代码是怎样一 ...

  8. ES6实现图片切换特效

    效果图 demo.html <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...

  9. LAMP(六)之以CentOS6自带的rpm包组合安装lamp

    1.Centos7部署应用wordpress 1. 安装php.php-mysql.mariadb yum install php php-mysql mariadb-server 2. 测试 cd ...

  10. shell-删除指定时间前的文件

    需要配合find和rm两个命令完成 显示20分钟前的文件: find /home/prestat/bills/test -type f -mmin +20 -exec ls -l {} \; 删除20 ...