码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces Round #501 (Div. 3) B Obtaining the String

时间:2018-08-16 10:38:51      阅读:126      评论:0      收藏:0      [点我收藏+]

标签:相等   ios   ace   swap   www   代码   algo   end   中间   

翻译

给你两个字符串\(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

标签:相等   ios   ace   swap   www   代码   algo   end   中间   

原文地址:https://www.cnblogs.com/lyfoi/p/9485070.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!