嘟嘟嘟

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

求公共部分自然想到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. java多线程-Thread

    大纲 sleep yield join setDaemon sleep: public static native void sleep(long millis) throws Interrupted ...

  2. encoding specified in XML prolog (UTF-8) is different from that specified in page directive (utf-8)

    myeclipse下启动项目后出现错误:encoding specified in XML prolog (UTF-8) is different from that specified in pag ...

  3. 三大视频网站Url的处理保存(视频和图片二选一操作)

    前台Js // 视频处理 var textVideoLink=$("input[name='textVideoLink']").val(); // 去除所有有的引号和空格 var ...

  4. Apache Beam的目标

    不多说,直接上干货! Apache Beam的目标 统一(UNIFIED) 基于单一的编程模型,能够实现批处理(Batch processing).流处理(Streaming Processing), ...

  5. QQ会员2018春节红包抵扣券项目背后的故事

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 1. 活动数据 截止3月1日手Q运动红包会员礼包发放核销数据 参与红包活动用户数:2亿+ 发券峰值:52w/min 2. 需求背景 2.1 ...

  6. Beyond Compare 4试用期已过

    Beyond Compare 很好用,但是只有一段时间的试用时间,当试用期过了之后就提示不能试用了 怎么办呢? 我在网上找到了两个方法: 1.直接用注册码(来自:https://blog.csdn.n ...

  7. ASP.NET之Request和Response对象

    经过了牛腩新闻公布系统和html的学习对B/S开发的流程有了些理解.前面尽管用到了非常多知识.但对制作网页仅仅能说知其然.当学到asp.net视频中的解说才干够说開始知其所以然了. 今天来说说clie ...

  8. 分支结构if……else

    语法: if(条件) 语句或语句块1 end else begin 语句或者语句块2 end 特点: . else并不一定是必须的. . 如否条件为真,将执行语句和语句块1,条件为假时执行语句或语句块 ...

  9. .Net Mvc框架知识点

    一.实现Controller的依赖注入: 1.自定义继承DefaultControllerFactory 类的控制器工厂类并重写GetControllerInstance方法:(如:InjectCon ...

  10. artDialog组件应用学习(一)

    个人觉得artDialog是一组很不错的对话框组件.写的是artDialog_v6应用. 官方称其兼容性测试通过:IE6~IE11.Chrome.Firefox.Safari.Opera. 官网:ht ...