首页 > 其他分享 >404 最小循环覆盖2

404 最小循环覆盖2

时间:2024-12-25 16:57:17浏览次数:6  
标签:覆盖 int 样例 最小 404 字符串 循环

// 404 最小循环覆盖2.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

/*
http://oj.daimayuan.top/course/22/problem/935

给你一个字符串 a
,你需要求出这个字符串的字典序最小的最小循环覆盖。

b是 a 的最小循环覆盖,当且仅当 a是通过 b复制多次并连接后得到的字符串的子串,
且 b 是满足条件的字符串中长度最小的。你需要找出字典序最小的最小循环覆盖。

输入一个字符串 a,输出一个字符串表示字典序最小的最小循环覆盖。

输入格式
一行一个字符串 a。

输出格式
输出一行一个字符串表示答案。

样例输入1
bcabcabcabcab
样例输出1
abc
样例输入2
aaaaaaa
样例输出2
a
数据规模
对于所有数据,保证 1≤|a|≤105
,字符串均由小写字母构成。
*/
#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;


const int N = 200010;
char s[N];
char cs[N];
int ne[N];
int n, m;

string getmin(char s[]) {
	int n = strlen(s + 1);
	for (int l = 1; l <= n; l++)
		s[l + n] = s[l];
	int i = 1, j = 2;
	while (j <= n) {
		int k = 0;
		while (k < n && s[i + k] == s[j + k])
			++k;
		if (s[i + k] > s[j + k])
			i += k + 1;
		else
			j += k + 1;
		if (i == j)
			++j;
		if (i > j)
			swap(i, j);
	}
	string res = "";
	for (int l = i; l <= i + n -1; l++)
		res += s[l];
	res = res.substr(0, res.size() / 2);
	return res;
}

//kmp求出最小循环节  然后最小表示法求出字母序最小的写法
int main()
{
	cin >> s + 1;
	m = strlen(s + 1);
	ne[1] = 0;
	for (int i = 2, j = 0; i <= m; i++) {
		while (j && s[i] != s[j + 1]) j = ne[j];
		if (s[i] == s[j + 1]) j++;
		ne[i] = j;
	}

	m = m - ne[m];
	for (int i = 1; i <= m; i++) {
		cs[i] = s[i]; cs[i + m] = s[i];
	}
	cout << getmin(cs);


    return 0;
}

 

标签:覆盖,int,样例,最小,404,字符串,循环
From: https://www.cnblogs.com/itdef/p/18630896

相关文章

  • 【华为OD-E卷-最小调整顺序次数、特异性双端队列 100分(python、java、c++、js、c)】
    【华为OD-E卷-最小调整顺序次数、特异性双端队列100分(python、java、c++、js、c)】题目有一个特异性的双端队列,该队列可以从头部或尾部添加数据,但是只能从头部移出数据。小A依次执行2n个指令往队列中添加数据和移出数据。其中n个指令是添加数据(可能从头部添加、也可能从......
  • 写个方法找出数组中位数差值最小的两个数
    在前端开发中,你可以使用JavaScript来编写一个方法,该方法接受一个数组作为输入,并找出中位数差值最小的两个数。这里有一个可能的实现:functionfindPairWithMinMedianDiff(arr){//首先对数组进行排序arr.sort((a,b)=>a-b);letminDiff=Infinity;letminPair......
  • docker 构建最小镜像 - 2MB 不到
    @目录1.编译code2.编写Dockerfile3.构建镜像4.运行起来5.总结1.编译coderoot@jn:/home/jn/Desktop/Docker#cathello.gopackagemainimport("fmt""time")funcmain(){for{fmt.Println("hello~")......
  • 定制最小linux系统 - 4: 使用vscode单步调试
    内核毕竟是一个很大的工程,有时看得一头雾水,如果能单步调试的话,对于理解可能有亿点帮助.下面一步步搭建qemu+vscode环境对内核进行单步调试.第一步编译内核定制最小linux系统-1:编译linux内核-CSDN博客https://blog.csdn.net/weixin_46766770/article/details/1......
  • 机器学习:线性回归:最小二乘法应用一元线性回归(持续更新)
    目录前言(基础知识的准备最小二乘法在回归中的应用)利用最小二乘法解决最简单的一元线性回归问题第一步:引入必要的库并且创建数据集(这里使用的例子是房价与面积的关系)第二步利用某些方法去用一条直线去拟合你的数据第三步观察与测评求出的W,B值与数据集的拟合程度并且......
  • 视频流媒体播放器EasyPlayer-RTSP原始录像文件被新录像文件覆盖是什么原因
    媒体播放器EasyPlayer有很多版本,其中EasyPlayer-RTSP就是能够输出RTSP视频流的版本,由于RTSP的需求众多,因此RTSP版本的用户也是很广泛。EasyPlayer-RTSP录像文件被覆盖EasyPlayer-RTSP是可以进行录像的,在录制录像文件时会出现开始录像后产生一个录像文件,停止录像后,录像文件被保存......
  • 404、基于51单片机的大棚控制仿真设计(温湿度CO2,DHT11,LCD1602)
    毕设帮助、开题指导、技术解答(有偿)见文末。目录一、设计功能二、proteus仿真三、原理图四、程序源码五、资料包括一、设计功能大棚温湿度、二氧化碳含量控制系统:1、检测温湿度(DHT11)2、检测二氧化碳浓度(电位器代替)3、设置上下限,如果参数过限,启动控制自动调控大......
  • 76. 最小覆盖子串
    题目链接解题思路:以i开头,最小覆盖子串是什么,然后求出所有的结果,最小的便是。先求出i的结果,是[i,j],然后求i+1时,直接从j后遍历即可。窗口的思想,窗口在[i,j],然后来到i+1,先把i弹出去,弹出去的前提是,s[i]是我们需要的字符。然后再看[i+1,j]是否满足,如果不满足,右边界再继续扩......
  • 最小覆盖子串
      滑动窗口算法的思路是这样:1、我们在字符串S中使用双指针中的左右指针技巧,初始化left=right=0,把索引左闭右开区间[left,right)称为一个「窗口」。2、我们先不断地增加right指针扩大窗口[left,right),直到窗口中的字符串符合要求(包含了T中的所有字符)......
  • Java代码覆盖率super-jacoco
    开源项目地址https://gitee.com/didiopensource/super-jacoco项目流程项目架构部署步骤注意:一定要用Linux服务器部署,不要用Windows准备Linux服务器环境安装好JDK1.8安装好git安装和配置好Maven3.6,或3.6以下安装MySQL数据库(尽量不用8版本,就用5.7、5.8版本)拉取super-......