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();
}
}