E1. Erase and Extend (Easy Version)(纯暴力+string)

Problem - 1537E1 - Codeforces

 

这是该问题的简单版本。唯一的区别是对n和k的约束。只有当所有版本的问题都解决了,你才能进行黑客攻击。

你有一个字符串s,你可以对它进行两种类型的操作。

删除字符串的最后一个字符。
复制字符串:s:=s+s,其中+表示连接。
你可以对每个操作进行任意次数的操作(可能没有)。

你的任务是找到长度恰好为k的最小的勒克斯坦字符串,该字符串可以通过对字符串s进行这些操作获得。

当且仅当以下情况之一成立时,一个字符串a在词典上比一个字符串b要小。

a是b的前缀,但a≠b。
在a和b不同的第一个位置,字符串a有一个字母在字母表中出现的时间比b中的相应字母早。
输入
第一行包含两个整数n,k(1≤n,k≤5000)--原始字符串s的长度和所需字符串的长度。

第二行包含字符串s,由n个小写英文字母组成。

输出
打印通过对字符串s进行操作可以得到的长度为k的最小的词典式字符串。

例子
inputCopy
8 16
dbcadabc
outputCopy
dbcadabcdbcadabc
输入拷贝
4 5
abcd
输出拷贝
aaaaa
注意
在第一次测试中,最好进行一次复制。"dbcadabc"→"dbcadabcdbcadabc"。

在第二个测试中,最佳做法是删除最后3个字符,然后将字符串复制3次,再删除最后3个字符,使字符串的长度为k。

"abcd"→"abc"→"ab"→"a"→"aaa"→"aaaaa"→"aaaaa"→"aaaaa"→"aaaaa"。

个人觉得比较有用的几种string函数

 

 

 

 

题解:
写题时想过暴力的写法,感觉会t就没写(淦)

根据题意要我们找到最小的

那我们把所有前缀都变成长度为k的字符串比较大小即可

#include<iostream>
#include<algorithm>
#include<string>
#include<queue>
#include<vector>
#include<map>
#include<cstring>
#include<cmath>
using namespace std;
#define int long long
void solve()
{
	int n,k;
	cin >> n >> k;
	string s;
	cin >> s;
	string ans = "";
	for(int i = 0;i < k;i++)
	{
		ans += 'z';
	}
	for(int i = 1;i <= n;i++)
	{
		int c1 = k/i;
		int c2 = k%i;
		string p = s.substr(0,i);
		string now = "";
		for(int j = 1;j <= c1;j++)
		{
			now += p;
		}
		now += s.substr(0,c2);
		ans = min(ans,now);
	}
	cout << ans;
}

//dabcdabbddd
//dabcdabbddd
//ddadd


signed main()
{
//	ios::sync_with_stdio(false);
//	cin.tie(0);
//	cout.tie(0);
	int t = 1;
//	cin >> t;
    while(t--)
	{
		solve();
	} 
}




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值