Codeforces Round #585 (Div. 2) C - Swap Letters

比赛的时候wa了两发,赛后发现bug,改一发过了qwq

思路:

先统计a的总数和b的总数,若是出现奇数,输出-1

接着统计,上下两行出现“ab”“ba”的次数,比如

aabbb

bbaba

竖着看:ab出现了2次,ba出现了2次

(1)ab出现了奇数次,那么ba一定也出现奇数次

aaa            baa                                       bbb               abb

bbb     =>   bab                                       aaa    =>      aba

此时就只有:

ab              bb               ab

ba    =>      aa   =>        ab

掌握到精髓了么?就是为ab的两两交换,为ba的两两交换,最后剩一对ab和ba,然后ab上下交换,变成aa,bb(竖着看)然后再斜着交换

(2)ab出现了偶数,那么ba肯定也出现偶数次,就两两交换好了

    #include<iostream>
    #include<cstdio>
    #include<string>
    #include<algorithm>
    #include<cstring>
    #include<set>
    #include<map>
    #include<queue>
    #include<vector>
    #include<cmath>
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    #define ll long long
    using namespace std;
    typedef pair<int,int>P;
    const int N=2e5+5;
    const int INF=0x3f3f3f3f;
    char s[N],t[N];
    vector<int>f1,f2;
    int main(){
        int n;
        while(scanf("%d",&n)!=EOF){
            f1.clear();f2.clear();
            scanf("%s%s",s,t);
            int a=0,b=0;
            for(int i=0;i<n;i++){
                if(s[i]=='a')a++;
                else b++;
                if(t[i]=='a')a++;
                else b++;
            }
            if(a%2||b%2){
                printf("-1\n");
                continue;
            }
            int ab=0,ba=0;
            for(int i=0;i<n;i++){
                if(s[i]==t[i])continue;
                if(s[i]=='a'&&t[i]=='b'){
                    ab++;
                    f1.push_back(i+1);
                }
                else {
                    ba++;
                    f2.push_back(i+1);
                }
            }
            int ans=0;
            if(ab%2==0&&ba%2==0)ans=ab/2+ba/2;
            else if(ab%2==1&&ba%2==1)ans=ab/2+ba/2+2;
            printf("%d\n",ans);
            int k1,k2;
            if(ab%2){
                for(int i=0;i<f1.size()-1;i+=2){
                       printf("%d %d\n",f1[i],f1[i+1]);
                   }
                for(int i=0;i<f2.size()-1;i+=2){
                       printf("%d %d\n",f2[i],f2[i+1]);
                }
                printf("%d %d\n",f1[f1.size()-1],f1[f1.size()-1]);
                printf("%d %d\n",f1[f1.size()-1],f2[f2.size()-1]);
            }
            else{
                for(int i=0;i<f1.size();i+=2){
                    printf("%d %d\n",f1[i],f1[i+1]);
                }
                for(int i=0;i<f2.size();i+=2){
                    printf("%d %d\n",f2[i],f2[i+1]);
                }
            }
        }
    }

还有一个字符串的题

也补到这里

主要是string和vector的应用,

另外,怎样把一个string里的子串p,全换成t,避免

wwaacc中ac换成aa,结果错误的输出成wwaaaa(正确是:wwaaac)

int pos=s.find(p);
while(pos!=s.npos){
    s.replace(pos,p.length(),t);
    pos=s.find(p,pos+t.length());
 }
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<set>
#include<map>
#include<queue>
#include<vector>
#include<cmath>
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define ll long long
using namespace std;
typedef pair<int,int>P;
const int N=1e4+5;
const int INF=0x3f3f3f3f;


vector<string>vec;
vector<string>ans;

void solve(string p,string t){
    for(int i=0;i<vec.size();i++){
        string s=vec[i];
        int pos=s.find(p);
        while(pos!=s.npos){
            s.replace(pos,p.length(),t);
            pos=s.find(p,pos+t.length());
        }
        vec[i]=s;
    }
}

void solve1(string s){
    vector<int>ask;
    int num=0,siz=vec.size();
    for(int i=0;i<s.length();i++){
        if(s[i]=='/'){
            if(num<=siz)ask.push_back(num);
            num=0;
        }
        else num=num*10+s[i]-'0';
    }
    if(num<=siz)ask.push_back(num);
    string tmp="";
    for(int i=1;i<ask.size();i++){
        tmp+=vec[ask[i]-1];
    }

    string tmp1=vec[ask[0]-1];
    vec[ask[0]-1]=tmp1+tmp;
    sort(ask.begin()+1,ask.end());
    for(int i=ask.size()-1;i>=1;i--){
        vec.erase(vec.begin()+ask[i]-1);
    }
}

string pro(string s){
    string qs="";
    for(int i=0;i<s.length();i++){
        if(i+1<s.length()&&s[i]=='\\'&&s[i+1]=='/'){
            continue;
        }
        else qs+=s[i];
    }
    return qs;
}

int main(){
    string s;
    while(getline(cin,s)){
        if(s=="[/Text]")break;
        if(s!="[Text]"){
            vec.push_back(s);
        }
    }

    string str;
    string qs;
    int line,pos;
    while(getline(cin,str)){
        if(str[0]=='q'){
            line=0;
            for(int i=3;i<str.length();i++){
                if(str[i]=='/'){pos=i+1;break;}
                line=line*10+str[i]-'0';
            }
            qs=str.substr(pos);
            qs=pro(qs);
            string t=vec[line-1];
            if(t.find(qs)!=string::npos){
                ans.push_back("Yes");
            }
            else {
                ans.push_back("No");
            }
        }
        else if(str[0]=='c'){
            for(int i=2;i<str.length();i++){
                if(str[i]=='/'&&str[i-1]!='\\'){pos=i;break;}
            }
            string p=str.substr(2,pos-2);
            string t=str.substr(pos+1);
            p=pro(p);
            t=pro(t);

            solve(p,t);
        }
        else if(str[0]=='f'){
            solve1(str.substr(2));
        }
        else{
            line=0;
            for(int i=2;i<str.length();i++){
                if(str[i]=='/'){pos=i+1;break;}
                line=line*10+str[i]-'0';
            }
            if(str[0]=='i'){
                qs=str.substr(pos);
                qs=pro(qs);
                if(line<=vec.size())vec.insert(vec.begin()+line-1,qs);
                else vec.push_back(qs);
            }
            if(str[0]=='d'){
                if(line<=vec.size())vec.erase(vec.begin()+line-1);
            }
        }
    }
    for(int i=0;i<vec.size();i++){
        cout<<vec[i]<<endl;
    }
    for(int i=0;i<ans.size();i++){
        cout<<ans[i]<<endl;
    }
}

/*
[Text]
1 222 33 44
2 333 45 d b g 3
3 444 56 333 54
[/Text]
c 333/zhang
d 1
i 1/This is a new line 1.
i 4/This is a new line 4.
f 3/4
i 100/new line.


[Text]
ab cdefghij klmn20abcedf
ab
a a bb  ccd e
[/Text]
c ab/12345
q #1/def
q #2/0

[Text]
a/b cdefg\\hij klmn20cedf
a\b
a a bb  ccd e
[/Text]
q #1/ab
q #1/a\/b
q #2/a\b
q #2/ccd


[Text]
wwaacc
[/Text]
c ac/aa


[Text]
1
2
3
4
5
6
7
8
9
(10)
[/Text]
d 5
d 6
d 8
d 6
d 1
d 2
d 3
d 2
d 2
d 1
i 10/uvwxyz
i 1/hijklmn
i 2/opq
i 3/rst
i 1/abcdefg
f 4/5/6/7
f 2/1/4/3
i 2/abcdefghijklmnopqrstuvwxyz
i 2/abcdefgrstuvwhijklmnxyzopq
c xyzopq/1\/2\/3\/4\/5\/6
c gr/gh
c fgh/2\/3\/4\/5
c 3\/4/5\/6
c 6\/5/65
q #2/5\/6
q #3/1\/2
*/

补完题浑身舒爽

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值