cf1277D——思维贪心+字符串

总是把题目想复杂,哎

/*
所有0x0的摆在一起,1x1摆在一起
考虑0x1或1x0,
如果有0x0且1x1,但是没有0x1或1x0,那么不可行
所有0x0,1x1都接在同一个0x1两端,所以只要考虑0x1和1x0即可
如果一个 串的反串有对应的,那么这个串就不可以翻转,反之是可以的,
    即可以从0x1->1x0,或者1x0->0x1 

*/
#include<bits/stdc++.h>
using namespace std;
#define N 200005

int n;
set<string>se[2];
map<string,int>mp;
void init(){
    se[0].clear();se[1].clear();
    mp.clear();
}

int main(){
    int t;cin>>t;while(t--){
        init();
        
        cin>>n;
        int cnt00=0,cnt11=0;
        for(int i=1;i<=n;i++){
            string s;
            cin>>s;
            if(s[0]=='0' && s[s.size()-1]=='0')    
                cnt00++;
            else if(s[0]=='1' && s[s.size()-1]=='1')
                cnt11++;
            else if(s[0]=='0' && s[s.size()-1]=='1')
                se[0].insert(s);
            else se[1].insert(s);
            mp[s]=i;
        }
        
        if(cnt00 && cnt11 && !se[0].size() && !se[1].size()){
            puts("-1");continue;
        }
        
        
        int size0=se[0].size(),size1=se[1].size();
        int tot=se[0].size()+se[1].size();
        vector<int>ans;
        if(se[0].size()>se[1].size()){
            for(auto ss:se[0]){
                if(size1>=tot/2)break;
                string tmp=ss;
                reverse(tmp.begin(),tmp.end());
                if(se[1].find(tmp)!=se[1].end())continue;
                else {
                    size0--;size1++;
                    ans.push_back(mp[ss]);
                }
            }
        }
        else {
            for(auto ss:se[1]){
                if(size0>=tot/2)break;
                string tmp=ss;
                reverse(tmp.begin(),tmp.end());
                if(se[0].find(tmp)!=se[0].end())continue;
                else {
                    size1--;size0++;
                    ans.push_back(mp[ss]);
                }
            }
        }
        
        if(abs(size0-size1)<=1){
            cout<<ans.size()<<'\n';
            for(auto x:ans)cout<<x<<" ";
            puts("");
        }
        else puts("-1");
    }
    
}
 

猜你喜欢

转载自www.cnblogs.com/zsben991126/p/12110193.html