比赛的时候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
*/
补完题浑身舒爽