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——思维贪心+字符串的主要内容,如果未能解决你的问题,请参考以下文章
[贪心] aw3774. 亮灯时长(思维+后缀和+代码细节+CF1000B)
Codeforces Round #619 (Div. 2)/CF1301 思维+贪心+模拟+构造+二维ST表