CF训练字符串小结论

题目

https://codeforces.com/problemset/problem/2192/B

解析

就是给你一个01字符串,要求的是你选择一个下标,除了这个下标之外的所有s[i]都是取反,就是0变成1,1变成0,要求后面全部变成0,结论就是,如果0的个数是奇数,或者1的个数是偶数就可以

#include<bits/stdc++.h>
using namespace std;
//"O campeão tem nome, e se chama Charles Oliveira!"
#define int long long
#define endl '\n'
#define ep emplace
#define pob 
#define ll long long
#define pb push_back
#define pof pop_front
#define pob pop_back
#define all(a) a.begin(),a.end()
#define rall(a) a.rbegin(),a.rend()
#define mod 998244353
#define MOD 1000000007
#define N 200010
#define INF 1e18

using ld = long double;
using ui = unsigned;
using ull = unsigned long long;
using i128 = __int128;
/*
这个是可以严格证明的,但是没必要写下来:
*/
void solve() {
   int n;cin>>n;
   string s;cin>>s;
   int cnt0=0,cnt1=0;
   for(int i=0;i<s.length();i++){
    if(s[i]=='0'){
        cnt0++;
    }
    else {
        cnt1++;
    }
   }
   if(cnt1%2==0){
    cout<<cnt1<<endl;
    for(int i=0;i<s.length();i++){
        if(s[i]=='1'){
            cout<<i+1<<" ";
        }
    }
    cout<<endl;
   }
   else if(cnt0%2==1){
    cout<<cnt0<<endl;
    for(int i=0;i<s.length();i++){
        if(s[i]=='0'){
            cout<<i+1<<" ";
        }
    }
    cout<<endl;
   }
   else {
    cout<<-1<<endl;
   }
}
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int t=1;
    cin>>t;
    //prefact();
    while(t--)solve();
}
posted @ 2026-04-12 11:43  Time_q  阅读(4)  评论(0)    收藏  举报