E. Erase and Extend
题目传送门:
题面截图:
题目大意:
给你字符串,可以进行两种操作:
- 要么删除最后一个
- 要么把字符串重复一遍
最终要你通过上述操作弄出一个特定长度字符串,要求字符串字典序最小。
思路:
首先可以得到,最优字符串一定是先进行第一步操作若干次,再进行后一步操作若干次,混用是没有意义的。
就是如果以单个为例:
ababaaaaa…比aaaaaaaaa更优,那么说明b就是比a强,那么直接bbbbb…肯定更好。
然后就可以开始写代码啦!
判断重复的模式串里要不要加入这一位。
看是加了更优还是不加更优判断。
但是不知道怎么处理一样优的。
WA了一发,不太懂。
代码:
# include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 2e5 + 10;
int main() {
string str;
int n, k;
cin >> n >> k;
cin >> str;
int p = 1;
for (int i = 1; i < n; i++) {
if (str[i % p] < str[i])
break;
if (str[i % p] > str[i])
p = i + 1;
}
for (int i = 0; i < k; i++)
cout << str[i % p];
cout << endl;
}
// cout << p << endl;
//100
//5
//1 50 9000 100000 10000000000