• CF 1381 A2 Prefix Flip (Hard Version)(思维 + 暴力)


    传送门

    题目:

    There are two binary strings a and b of length nn (a binary string is a string consisting of symbols 0 and 1). In an operation, you select a prefix of a, and simultaneously invert the bits in the prefix (0 changes to 1and 1 changes to 0) and reverse the order of the bits in the prefix.

    For example, if a=001011 and you select the prefix of length 3, it becomes 011011. Then if you select the entire string, it becomes 001001

    Your task is to transform the string a into b in at most 2n operations. It can be proved that it is always possible.

    思路:我们可以每次只处理一位二进制,让a的第一位和b的最后一位不同,然后反转a未匹配的串,每次匹配一个b的后面的字符,这样最多操作也是2n。

     

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <algorithm>
     4 #include <queue>
     5 #include <string>
     6 #include <vector>
     7 #include <cmath>
     8  
     9 using namespace std;
    10  
    11 #define ll long long
    12 #define pb push_back
    13 #define fi first
    14 #define se second
    15  
    16 const int N = 2e5 + 10;
    17 ll a[N], dp[N], sum; 
    18 
    19 void solve()
    20 {      
    21     int T;
    22     cin >> T;
    23     while(T--){
    24         int n;
    25         string a, b;
    26         cin >> n >> a >> b;
    27 
    28         int k, al, ar, br, cnt, now;
    29         vector<int > ans;
    30         now = k = al = cnt = 0;
    31         ar = br = n - 1;
    32         while(1){
    33             //printf("a[now] = %c  b[br] = %c
    ", a[now], b[br]);
    34             if(cnt & 1){
    35                 if((a[now] - '0' + cnt) % 2 == b[br] - '0'){
    36                     k += 2, br--, ar--, now = al;
    37                     ans.pb(1);
    38                     ans.pb(n - cnt);
    39                 }else{
    40                     k += 1, br--, ar--, now = al;
    41                     ans.pb(n - cnt);
    42                 }
    43                 cnt++;
    44             }else{
    45                 if((a[now] - '0' + cnt) % 2 == b[br] - '0'){
    46                     k += 2, br--, al++, now = ar;
    47                     ans.pb(1);
    48                     ans.pb(n - cnt);
    49                 }else{
    50                     k += 1, br--, al++, now = ar;
    51                     ans.pb(n - cnt);
    52                 }
    53                 cnt++;
    54             }
    55             //cout << "k = " << k << endl;
    56             //cout << " cnt = " << cnt << endl;
    57             //cout << "br = " << br << endl;
    58             if(br < 0) break;
    59         }
    60 
    61         //cout << "ans = " << k << " ";
    62         cout << k << endl;
    63         for(auto x : ans) cout << x << " ";
    64         cout << endl;
    65     }
    66 }
    67  
    68 int main()
    69 {
    70     ios::sync_with_stdio(false);
    71     cin.tie(0);
    72     cout.tie(0); 
    73     solve();
    74  
    75     return 0;
    76 }
  • 相关阅读:
    加一---简单
    gcc/g++常用命令
    2.3 进程间通信
    js( Object类闭包)
    js构造函数,成员函数详解
    二维数组 冒泡排序
    js数组
    js函数的调用
    仿搜狐首页的布局
    JavaScript基本语法1
  • 原文地址:https://www.cnblogs.com/SSummerZzz/p/13367749.html
Copyright © 2020-2023  润新知