题目链接:https://codeforces.com/contest/1382/problem/C2
给定一个只有0和1的字符串。定义操作为:取这个字符串的一段前缀,将这段前缀的所有位取反后翻转。求如何进行操作可以得到目标串
这个看了一眼提示......考虑先变成全0的串,然后再变成目标串(这个是怎么想到先变成全0的??)。这两个过程都只需要至多n步。对于变成全0的过程,只要判断i和i+1位是否相同。如果不相同则对i进行操作。最后得到一个全1或全0的串,如果是全1的串再对n操作一次即可。对于全0串变成目标串的过程,我是用一个cnt判断当前操作了奇数次或偶数次,从而判断当前位置是否需要操作。详见代码的那个比较长的if
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=1e5+10;
int t,n,i,j,k;
char s1[maxn],s2[maxn];
void solve(){
vector<int> ans;
int num=0;s1[n+1]=‘0‘;
for (i=1;i<=n;i++)
if (s1[i]!=s1[i+1]) {
ans.push_back(i);num++;
}
for (i=1;i<=n;i++) s1[i]=‘0‘;
int cnt=0;
for (i=n;i>=1;i--)
if ((s2[i]==‘1‘&&cnt%2==0)||s2[i]==‘0‘&&cnt%2==1){
ans.push_back(i);
num++;cnt++;
}
cout<<num<<endl;
for (i=0;i<ans.size();i++) cout<<ans[i]<<‘ ‘;
cout<<endl;
}
int main(){
cin>>t;
while (t--){
cin>>n;
cin>>s1+1>>s2+1;
solve();
}
return 0;
}
原文:https://www.cnblogs.com/edmunds/p/13398495.html