Codeforces Round #501 (Div. 3) B Obtaining the String
Posted lyfoi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #501 (Div. 3) B Obtaining the String相关的知识,希望对你有一定的参考价值。
翻译
给你两个字符串(s)与(t),你每次可以交换字符串(s)种相邻两个字符,请你输出字符串(s)变成(t)的步骤(如果输出(k),代表交换了(k)与(k+1)),如果有多组解,随意输出一种即可。
思路
这道题一开始考虑复杂了,导致我发奋图强到(11:40)才(A)掉,我(12:00)必须睡觉因为明天有课(www)。
实际不难,这题是(SPJ),我是这么想的:我们都知道任意(1)个字符可以通过交换相邻的两个字符来跑遍整个字符串。
进而可以得出:只要我们可以枚举字符串(t)的每一个字符,并让(j)从这个字符开始(这是为了方便后面的交换),找到字符串(s)中的第一个与他相等的字符,如果是合法的情况,那么每个字符都能对上去才对,所以找不到直接(-1);然后从与其一样的字符开始向其进军,一直到他为止,中间的步骤要记录下来。
然后,完事了,代码有注释。看来(Div3)对于我这种蒟蒻不算太水啊!
Code
#include<iostream>
#include<algorithm>
using namespace std;
int n,num,f,ans[1000001];
string s,t;
int main()
{
cin>>n>>s>>t;
for(int i=0;i<n;i++)
{
f=false;
int j;
for(j=i;j<n;j++)
if(t[i]==s[j])
{
f=true;//找到第一个相等的并跳出,记录为找到
break;
}
if(f==false)
return cout<<-1<<endl,0;
for(int k=j-1;k>=i;--k)
{
ans[++num]=k;
swap(s[k],s[k+1]);
}
}
cout<<num<<endl;
for(int i=1; i<=num; i++)
cout<<ans[i]+1<<" ";//因为我们是下标从0开始,所以要加一
return 0;
}
以上是关于Codeforces Round #501 (Div. 3) B Obtaining the String的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #501 (Div. 3) F. Bracket Substring
Codeforces Round #501 (Div. 3) ABDE1E2
Codeforces Round #501 (Div. 3) 翻船记
Codeforces Round #501 (Div. 3) B Obtaining the String