洛谷题单指南-字符串-Test

news/2024/10/23 9:39:48

原题链接:https://www.luogu.com.cn/problem/CF25E  https://codeforces.com/contest/25/problem/E

题意解读:给定a,b,c三个字符串,求包含a、b、c的最短字符串长度。

解题思路:

要得到包含a、b、c的字符串,可以通过a、b、c连接形成,而要使得连接后的字符串最短,可以尽可能的利用重叠部分

如a、b字符串连接的情况可能有三种:连续、交叉、包含

因此,对于a、b字符串连接的最短长度,可以先计算a是否包含b,如果包含b,连接后的长度即a的长度;再计算a后缀与b前缀公共长度ab,连接后长度为a.size()+b.size()-ab。

而a、b、c连接的方式一共有六种:

a->b->c

a->c->b

b->a->c

b->c->a

c->a->b

c->b->a

枚举所有情况下连接后得到的字符串长度,取最短即可。

这里有一个关键函数:int longest(string &x, string &y)

用来计算x后缀与y前缀的最长公共长度,且如果x包含y函数返回-1

STL String暴力枚举:

int longest(string &x, string &y)
{if(x.find(y) != string::npos) return -1; //如果x包含yint len = min(x.size(), y.size());int res = 0;for(int i = 1; i <= len; i++) //枚举前后缀的公共长度{string post = x.substr(x.size() - i, i); //x的后缀string pre = y.substr(0, i); //y的前缀if(post == pre) res = i; //判断是否相等}return res;
}

以上方法是O(n^2)的,必须优化

KMP优化实现:

int longest_kmp(string &x, string &y)
{memset(Next, 0, sizeof(Next));//利用y计算Next数组for(int i = 1, j = 0; i < y.size(); i++){while(j && y[i] != y[j]) j = Next[j - 1];if(y[i] == y[j]) j++;Next[i] = j;}int j = 0;//在x中找y,如果找到返回-1,如果没找到,返回y最后匹配的位置即最大公共前后缀长度for(int i = 0; i < x.size(); i++){while(j && x[i] != y[j]) j = Next[j - 1];if(x[i] == y[j]) j++;if(j == y.size()) return -1;}return j;
}

100分代码: 

#include <bits/stdc++.h>
using namespace std;string a, b, c;
int Next[100005];//计算相同的x的后缀和y的前缀长度,x包含y时返回-1
int longest(string &x, string &y)
{if(x.find(y) != string::npos) return -1; //如果x包含yint len = min(x.size(), y.size());int res = 0;for(int i = 1; i <= len; i++) //枚举前后缀的公共长度{string post = x.substr(x.size() - i, i); //x的后缀string pre = y.substr(0, i); //y的前缀if(post == pre) res = i; //判断是否相等}return res;
}//用KMP优化上面的longest函数
int longest_kmp(string &x, string &y)
{memset(Next, 0, sizeof(Next));//利用y计算Next数组for(int i = 1, j = 0; i < y.size(); i++){while(j && y[i] != y[j]) j = Next[j - 1];if(y[i] == y[j]) j++;Next[i] = j;}int j = 0;//在x中找y,如果找到返回-1,如果没找到,返回y最后匹配的位置即最大公共前后缀长度for(int i = 0; i < x.size(); i++){while(j && x[i] != y[j]) j = Next[j - 1];if(x[i] == y[j]) j++;if(j == y.size()) return -1;}return j;
}//计算x->y->z连接顺序下的最短字符串长度
long long calcu(string &x, string &y, string &z, int xy, int yz, int xz)
{long long res = x.size(); //加上x的长度if(xy >= 0) //如果y不是x的子串{res += y.size() - xy; //加上y的长度,减去y前缀和x后缀重叠部分的长度if(yz >= 0) res += z.size() - yz; //如果z不是y的子串,加上z的长度,减去z前缀和y后缀重叠部分的长度} else //如果y是x的子串{if(xz >= 0) res += z.size() - xz; //如果z不是x的子串,加上z的长度,减去z前缀和x后缀重叠部分的长度}return res;
}int main()
{cin >> a >> b >> c;int ab = longest_kmp(a, b);int ba = longest_kmp(b, a);int bc = longest_kmp(b, c);int cb = longest_kmp(c, b);int ca = longest_kmp(c, a);int ac = longest_kmp(a, c);long long ans = 1e18, t;//abct = calcu(a, b, c, ab, bc, ac);ans = min(ans, t);//acbt = calcu(a, c, b, ac, cb, ab);ans = min(ans, t);//bact = calcu(b, a, c, ba, ac, bc);ans = min(ans, t);//bcat = calcu(b, c, a, bc, ca, ba);ans = min(ans, t);//cabt = calcu(c, a, b ,ca, ab, cb);ans = min(ans, t);//cbat = calcu(c, b, a, cb, ba, ca);ans = min(ans, t);cout << ans;return 0;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/72149.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

网站phpmyadmin修改密码?

要在phpMyAdmin中修改数据库用户的密码,你可以按照以下步骤操作:登录phpMyAdmin:打开你的Web浏览器并访问phpMyAdmin的URL地址。 输入用户名和密码进行登录。选择数据库服务器:登录后,在左侧菜单栏中选择一个数据库服务器(通常是左侧列表中的MySQL或具体的服务器名称)。…

DevEco Studio实时检查

辑器会实时的进行代码分析,如果输入的语法不符合编码规范,或者出现语义语法错误,将在代码中突出显示错误或警告,将鼠标放置在错误代码处,会提示详细的错误信息。 从DevEco Studio 4.0 Release版本开始,当compatibleSdkVersion≥10时,编辑器代码实时检查支持ArkTS性能语法…

XCVU9P 板卡设计原理图:616-基于6U VPX XCVU9P+XCZU7EV的双FMC信号处理板卡 高性能数字计算卡

一、板卡概述 板卡基于6U VPX标准结构,包含一个XCVU9P 高性能FPGA,一片XCZU7EV FPGA,用于 IO扩展接口,双路HPC FMC扩展高速AD、DA、光纤接口等。是理想应用于 二、处理板技术指标 ● 主FPGA采用XCVU9P-2FLGA2104I; 从FPGA型号为XCZU7EV-2FFVC1156I;● 主 FPGA外挂2组DDR…

从零开始学机器学习——分类器详解

首先给大家介绍一个很好用的学习地址:https://cloudstudio.net/columns 今天我们将结合第一章节中清洗得到的菜品数据,利用多种分类器对这些数据进行训练,以构建有效的模型。在这个过程中,我会详细讲解每一种分类器的原理及其重要性。 尽管这些知识点对于实践来说并不是必须…

TowardsDataScience-博客中文翻译-2021-八十六-

TowardsDataScience 博客中文翻译 2021(八十六)原文:TowardsDataScience Blog 协议:CC BY-NC-SA 4.0内部对齐问题原文:https://towardsdatascience.com/the-inner-alignment-problem-9eb5f234226b?source=collection_archive---------38-----------------------播客 埃文…

TowardsDataScience-博客中文翻译-2021-八十-

TowardsDataScience 博客中文翻译 2021(八十)原文:TowardsDataScience Blog 协议:CC BY-NC-SA 4.0AWS 胶水上的火花 MLlib原文:https://towardsdatascience.com/spark-mllib-in-aws-glue-1416b3b5ffe6?source=collection_archive---------23-----------------------机器学…

牛逼!5K star! 推荐一款集监控和埋点于一体的前端性能监控工具!开源、简单易用、功能强大!

在互联网的快速发展下,网站已成为企业和个人展示信息、提供服务的重要平台。然而,随之而来的网站性能问题也日益凸显,如加载速度慢、频繁出错、服务器故障、数据异常、网络攻击等。如何确保用户能够快速稳定地访问网站成为了一个亟待解决的问题。 为了帮助大家解决这一问题,…

TowardsDataScience-博客中文翻译-2020-一百二十九-

TowardsDataScience 博客中文翻译 2020(一百二十九)原文:TowardsDataScience Blog 协议:CC BY-NC-SA 4.0什么是机器学习?—直观的解释。原文:https://towardsdatascience.com/what-is-machine-learning-a-visual-explanation-14642b90429f?source=collection_archive---…