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;
    }
    

      

  • 相关阅读:
    通过注册表读取设置字体
    StretchBlt
    PatBlt
    如何用MaskBlt实现两个位图的合并,从而实现背景透明
    输出旋转字体
    用字体开透明窟窿
    输出空心字体
    光滑字体
    画贝塞尔曲线
    一些点运算函数
  • 原文地址:https://www.cnblogs.com/edmunds/p/13398495.html
Copyright © 2011-2022 走看看