cf1382C2---构造

题目链接: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