题目链接
题意:有一个由L和R组成的字符,每一轮你都可以将RL变化成LR,问你能否刚好经过k轮把字符串变成左边都是L,右边都是R。
思路:暴力构造就行,我们可以算出构造出这样的字符串的最小步骤和最大步骤的,只要k在这个范围内就肯定能构造出来。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=3e3+5;
vector<int>ans[maxn];
char s[maxn];
int main()
{
int n,k,cnt=0,sum=0;
scanf("%d %d",&n,&k);
scanf("%s",s+1);
while(1)
{
int flag=0;
cnt++;
for(int i=1;i<n;++i)
{
if(s[i]=='R'&&s[i+1]=='L') flag=1,ans[cnt].push_back(i);
}
if(!flag) break;
for(int i:ans[cnt]) swap(s[i],s[i+1]);
sum+=ans[cnt].size();
}
if(k<cnt-1||k>sum){
printf("-1\n");return 0;
}
for(int i=1;i<cnt;++i)
{
while(!ans[i].empty()&&k>cnt-i)
{
printf("1 ");
printf("%d\n",ans[i].back());
ans[i].pop_back();
k--;
}
if(!ans[i].empty())
{
printf("%d ",ans[i].size());
for(int j:ans[i]) printf("%d ",j);
printf("\n");
k--;
}
}
}