嘟嘟嘟

因为只有三个字符串,所以就有一个比较暴力的做法:枚举这三个串所有排列,然后对于每一个排列,减去这三个串两两的公共部分的长度,更新答案。

求公共部分自然想到kmp:比如s[1]接在s[0]后面,那么我们只用把s[0]和s[1]匹配,把s[1]当做模式串,s[0]当做文本串,当s[0]匹配到头的时候,看s[1]匹配到哪,就是这两个串的公共长度。

那么就会有s[1]是s[0]的子串的情况,这时候只记录s[0[的长度,然后再减去s[0]和s[2]的公共长度(我就是因为刚开始忘减了wa了几发)。

 #include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<vector>
#include<stack>
#include<queue>
using namespace std;
#define enter puts("")
#define space putchar(' ')
#define Mem(a, x) memset(a, x, sizeof(a))
#define rg register
typedef long long ll;
typedef double db;
const int INF = 0x3f3f3f3f;
const db eps = 1e-;
const int maxn = 1e5 + ;
inline ll read()
{
ll ans = ;
char ch = getchar(), last = ' ';
while(!isdigit(ch)) {last = ch; ch = getchar();}
while(isdigit(ch)) {ans = ans * + ch - ''; ch = getchar();}
if(last == '-') ans = -ans;
return ans;
}
inline void write(ll x)
{
if(x < ) x = -x, putchar('-');
if(x >= ) write(x / );
putchar(x % + '');
} char s[][maxn];
int len[], f[][maxn], kmp[][]; void init(int m, char *s, int id)
{
f[id][] = ;
for(int i = , j = ; i <= m; ++i)
{
while(s[j + ] != s[i] && j) j = f[id][j];
if(s[j + ] == s[i]) j++;
f[id][i] = j;
}
}
int KMP(int n, int m, char *s1, char *s2, int id)
{
int j = ;
for(int i = ; i <= n; ++i)
{
while(s2[j + ] != s1[i] && j) j = f[id][j];
if(s2[j + ] == s1[i]) j++;
if(j == m) return -;
}
return j;
} int main()
{
scanf("%s%s%s", s[] + , s[] + , s[] + );
int ans = INF;
for(int i = ; i < ; ++i) len[i] = strlen(s[i] + );
for(int i = ; i < ; ++i)
{
init(len[i], s[i], i);
for(int j = ; j < ; ++j) if(i != j)
kmp[j][i] = KMP(len[j], len[i], s[j], s[i], i);
//这时候要把i作为文本串,因为j的fail数组还没构造
}
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] - kmp[i][j] - kmp[j][k];
if(kmp[i][j] >= )
{
if(kmp[j][k] >= ) ans = min(ans, sum);
else ans = min(ans, sum - len[k] - );
}
else
{
if(kmp[j][k] >= ) ans = min(ans, sum - len[j] - + kmp[j][k] - kmp[i][k]);//别忘了
else ans = min(ans, len[i]);
}
}
write(ans); enter;
return ;
}

CF25E Test的更多相关文章

  1. CF25E:Test——题解

    https://vjudge.net/problem/CodeForces-25E 题目大意:给三个字符串,求最小串,使得前三个串都是它的子串. ———————————————— 这题虽然是看哈希的时 ...

  2. CF25E-Test【AC自动机,bfs】

    正题 题目链接:https://www.luogu.com.cn/problem/CF25E 题目大意 给出三个串,然后求一个最短的串包含这三个串. \(1\leq |s_1|,|s_2|,|s_3| ...

随机推荐

  1. (转)Shell全局变量、局部变量与特殊变量笔记总结

    Shell全局变量.局部变量与特殊变量笔记总结 原文:http://blog.csdn.net/apollon_krj/article/details/70148022 变量类型:全局变量(环境变量) ...

  2. 案例36-商品添加页面类别ajax显示

    1 add.jsp代码 <%@ page language="java" pageEncoding="UTF-8"%> <HTML> & ...

  3. linux下安装redis及PHP扩展应用

    一.redis安装 1 下载redis安装包 wget http://redis.googlecode.com/files/redis-2.4.17.tar.gz (若无法下载请手动下载) 2 编译安 ...

  4. [shell基础]——echo命令

    echo命令:在shell中主要用于输出 1. -n     不换行的显示结果(默认是换行的) 2. -e " "  支持双引号中使用一些特殊字符 常用的特殊字符有 \a 发出警告 ...

  5. 深入理解JavaScript系列(20):《你真懂JavaScript吗?》答案详解

    介绍 昨天发的<大叔手记(19):你真懂JavaScript吗?>里面的5个题目,有很多回答,发现强人还是很多的,很多人都全部答对了. 今天我们来对这5个题目详细分析一下,希望对大家有所帮 ...

  6. 0、安装Ionic2

    1.安装ionic2 $ npm install -g ionic@beta 2.创建项目 $ ionic start 项目名称 --v2 //  默认tabs的模板 $ ionic start 项目 ...

  7. C# this关键字的四种用法(转)

    用法一  this代表当前类的实例对象 namespace Demo { public class Test { private string scope = "全局变量"; pu ...

  8. MySQL8.0加载文件内容报错: ERROR 1148: The used command is not allowed with this MySQL version

    mysql数据库将文件内容加载到表中报错: mysql> LOAD DATA LOCAL INFILE '/path/pet.txt' INTO TABLE pet LINES TERMINAT ...

  9. 快速排序——Java实现

    一.排序思想 快速排序是由冒泡排序改进而得到的,是一种分区交换排序方法.思想如下:一趟快速排序采用从两头向中间扫描的方法,同时交换与基准记录逆序的记录. 在待排序的N个记录中任取一个元素(通常取第一个 ...

  10. uva 10635 LCS转LIS

    这道题两个数组都没有重复的数字,用lcs的nlogn再适合不过了 #include <iostream> #include <string> #include <cstr ...