cf1277D——思维贪心+字符串

Posted zsben991126

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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");
    }
    
}
 

以上是关于cf1277D——思维贪心+字符串的主要内容,如果未能解决你的问题,请参考以下文章

E. DeadLee 思维 贪心 cf官方答案代码详解

思维+贪心+dp——cf1341D

[贪心] aw3774. 亮灯时长(思维+后缀和+代码细节+CF1000B)

Codeforces Round #619 (Div. 2)/CF1301 思维+贪心+模拟+构造+二维ST表

CodeForces 1005D Polycarp and Div 3(思维贪心dp)

cf 1060d 思维贪心