1. 程式人生 > >Codeforces 922D Robot Vacuum Cleaner

Codeforces 922D Robot Vacuum Cleaner

題意:給定n個字串,S0Sn1Si字串均只由sh兩種字母構成。現在問你如何將S字串拼接成一個字串且使得二元組(i,j),且ij,s[i]=s,s[j]=h,這樣的二元組數量最多。
思路,先不考慮整體順序,只考慮兩個字串,對於任意兩個字串如果希望sh的二元組儘可能多,那麼很顯然只需要檢查SiSjSjSi兩個字串的二元組數目,比較二元組數目並定義其大小關係,排序即可。

#include<bits/stdc++.h>

using namespace std;
typedef long long
ll; const ll MOD = 1e9 + 7; const ll MAXN = 1e5; int cmp(const string &x,const string &y) { ll a1=0,a2=0,c1=0,c2=0; for(int i=0;i<x.size();i++) if(x[i]=='s')c1++; else a1+=c1; for(int i=0;i<y.size();i++) if(y[i]=='s')c1++; else a1+=c1; for
(int i=0;i<y.size();i++) if(y[i]=='s')c2++; else a2+=c2; for(int i=0;i<x.size();i++) if(x[i]=='s')c2++; else a2+=c2; return a1>a2; /* int len=min(x.size(),y.size()); for(int i=0;i<len;i++) { if(x[i]!=y[i]) { if(x[i]=='s')return true; else return false; } } if(x.size()>len&&x[len]=='s')return true; else if(x.size()>len &&x[len]=='h')return false; else if(y.size()>len &&y[len]=='s')return false; else return true; */
} int main() { ios::sync_with_stdio(false); int n; cin>>n; vector<string>v(n); for(int i=0;i<n;i++)cin>>v[i]; sort(v.begin(),v.end(),cmp); ll ans=0; ll cot=0; string ss; for(int i=0;i<n;i++) { for(int j=0;j<v[i].size();j++) { if(v[i][j]=='s')cot++; else ans+=cot; } ss+=v[i]; } //cout<<ss<<endl;; cout<<ans<<endl; }