码迷,mamicode.com
首页 > 其他好文 > 详细

cf1277D——思维贪心+字符串

时间:2019-12-28 09:53:08      阅读:72      评论:0      收藏:0      [点我收藏+]

标签:map   oid   vector   pre   reverse   mes   cout   continue   push   

总是把题目想复杂,哎

/*
所有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");
    }
    
}
 

cf1277D——思维贪心+字符串

标签:map   oid   vector   pre   reverse   mes   cout   continue   push   

原文地址:https://www.cnblogs.com/zsben991126/p/12110193.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!