​链接查看​

题意:

你可以进行以下的无限次操作,操作1:s=s+s,操作2 删去s的最后一个字符,最后问长度为k的字符的最小字典序。

思路:

考虑贪心做法,我们贪心的维护前缀,如果当前遍历的值比循环节对应的位置大直接break ,如果小于,那么显然肯定是要选择的,然后把指针弄成1,如果刚好等于,我们就把指针+1。

例如 “dbdadb”

从第二个开始指针为0,到第三个指针进1,到第四个a比b小指针又指向第0个位置,到最后指针到了2这个位置。

最后输出答案的串一定要让k变为0,也就是从最后pop掉k个数,因为没有k等于0的时候更优。

代码:

// Problem: E2. Erase and Extend (Hard Version)
// Contest: Codeforces - Codeforces Round #726 (Div. 2)
// URL: https://codeforces.com/contest/1537/problem/E2
// Memory Limit: 256 MB
// Time Limit: 2000 ms
//
// Powered by CP Editor (https://cpeditor.org)

#include<bits/stdc++.h>
#define ios ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
typedef long long ll;
using namespace std;
int main()
{
ios;
int n,tt;
cin >> n >> tt;
string s;
cin >> s;
int k=0;
int i;
for( i=1;i<s.size();i++)
{
if(s[i]>s[k]) break;
else if(s[i]<s[k]) k=0;
else k++;
}
string ans=s.substr(0,i);

while(k--)
ans.pop_back();
while(ans.size()<tt)
ans+=ans;
while(ans.size()>tt)
ans.pop_back();
cout<<ans<<endl;
return 0;
}