zoukankan      html  css  js  c++  java
  • 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()<<'
    ';
                for(auto x:ans)cout<<x<<" ";
                puts("");
            }
            else puts("-1");
        }
        
    }
     
  • 相关阅读:
    Virtuabox 虚拟机克隆方法
    CentOS 7 防火墙 出现Failed to start iptables.service: Unit iptables.service failed to load
    Linux系统下安装rz/sz命令及使用说明
    os、sys模块
    collections、random、hashlib、configparser、logging模块
    time、datatime模块
    正则表达式、re模块
    递归、二分查找法
    内置函数、匿名函数
    生成器进阶、生成器表达式
  • 原文地址:https://www.cnblogs.com/zsben991126/p/12110193.html
Copyright © 2011-2022 走看看