zoukankan      html  css  js  c++  java
  • 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;
    }
    

      

  • 相关阅读:
    第07组 Beta冲刺(1/5)
    软工实践个人总结
    SDN大作业
    第08组 Beta版本演示
    2019 SDN上机第7次作业
    第08组 Beta冲刺(5/5)
    第08组 Beta冲刺(4/5)
    第08组 Beta冲刺(3/5)
    第08组 Beta冲刺(2/5)
    2019 SDN上机第6次作业
  • 原文地址:https://www.cnblogs.com/edmunds/p/13398495.html
Copyright © 2011-2022 走看看