https://vjudge.net/problem/CodeForces-25E

题目大意:给三个字符串,求最小串,使得前三个串都是它的子串。

————————————————

这题虽然是看哈希的时候做的,但上网一查啊全是KMP。

所以果断用KMP做啦!

(话说网上的题解长得都一模一样一个字都没改所以就不贴了)

对于三个串共六种排法,排列组合一下然后在把他们重合的部分减去就会是答案。

而发现对于两个字符串ab去重,我们有两种情况:

1.a的尾部是b的头部:

通过KMP解决,输出KMP后(即a被匹配完了)b被匹配到哪里了,即是ab重合长度。

2.b是a的子串:

上述KMP还有一个目的就是为了判断是否为子串,如果是的话,跳过b,a和下一个字符串相接。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int INF=;
int nxt[][]={};
bool ok[];
void getnext(int m,char s2[],int t){
int j=;
for(int i=;i<=m;i++){
while(j!=&&s2[j+]!=s2[i])j=nxt[t][j];
if(s2[j+]==s2[i])j++;
nxt[t][i]=j;
}
return;
}
int KMP(int n,int m,char s1[],char s2[],int t){
int j=,cnt=;
for(int i=;i<=n;i++){
while(j!=&&s2[j+]!=s1[i])j=nxt[t][j];
if(s2[j+]==s1[i])j++;
if(j==m){
return -;
j=nxt[t][j];
}
}
return j;
}
char s[][];
int len[];
int K[][];
int main(){
scanf("%s%s%s",s[]+,s[]+,s[]+);
len[]=strlen(s[]+);
len[]=strlen(s[]+);
len[]=strlen(s[]+);
for(int i=;i<=;i++){
getnext(len[i],s[i],i);
for(int j=;j<=;j++){
if(i==j)continue;
K[j][i]=KMP(len[j],len[i],s[j],s[i],i);
}
}
int ans=INF;
for(int i=;i<=;i++){
for(int j=;j<=;j++){
for(int k=;k<=;k++){
if(i==j||j==k||i==k)continue;
int sum=len[i]+len[j]+len[k]-K[i][j]-K[j][k];
if(K[i][j]>=&&K[j][k]>=)ans=min(ans,sum);
else{
if(K[i][j]<&&K[i][k]<)ans=min(ans,len[i]);
else if(K[i][j]<)ans=min(ans,sum+K[i][j]+K[j][k]-len[j]-K[i][k]);
if(K[j][k]<)ans=min(ans,sum+K[j][k]-len[k]);
}
}
}
}
printf("%d\n",ans);
return ;
}

CF25E:Test——题解的更多相关文章

  1. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  2. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  3. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  4. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  5. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  6. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  7. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

  8. 网络流n题 题解

    学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...

  9. CF100965C题解..

    求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...

随机推荐

  1. dubbo入门(一)

    1.简介 Dubbo由阿里巴巴开源,是一个分布式服务框架,致力于提供高性能和透明化的RPC(远程过程调用)远程服务调用方案,以及SOA服务治理方案.如果没有分布式的需求,Dbubbo是不需要的,其本质 ...

  2. debian8+lnmp1.2一键安装+WordPress3.9

    下载并安装LNMP一键安装包 wget -c http://soft.vpser.net/lnmp/lnmp1.2-full.tar.gz && tar zxf lnmp1.2-ful ...

  3. 了解Python控制流语句——continue 语句

    continue 语句用以告诉 Python 跳过当前循环块中的剩余语句,并继续该循环的下一次迭代. 案例(保存为 continue.py): while True: s = input('Enter ...

  4. Mount qcow2 image

    1.Mount a qcow2 image qemu-nbd - QEMU Disk Network Block Device Server: Export QEMU disk image using ...

  5. vivado使用感想

    寒假学了一学期vivado也没有学出什么名堂:为了调试龙芯的五级流水CPU,今天肝了一下午结果还把vivado给摸清楚了,果然是以目标为导向最能出成绩. vivado开发硬件的流程 写代码 模拟仿真s ...

  6. 完全背包问题 :背包dp

    题目描述: 有 N种物品和一个容量是 V 的背包,每种物品都有无限件可用.第 i 种物品的体积是 vi,价值是 wi. 求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大.输出最 ...

  7. 01背包问题:DP

    题目描述: 有 N 件物品和一个容量是 V 的背包.每件物品只能使用一次. 第 i 件物品的体积是 vi,价值是 wi. 求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大.输出 ...

  8. Python中的名字隐藏

    Python对于module文件中的name是没有private和public区分的,严格来说,在module文件重定义的任何name,都可以被外界访问.但是,对于 from module imort ...

  9. c# 计算两个时间的时间差

    //计算2个日期之间的天数差 DateTime dt1 = Convert.ToDateTime("2007-8-1"); DateTime dt2 = Convert.ToDat ...

  10. ifream爱恨情缘

    开幕场景 iframe.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "h ...