题目大意:
给定n个字符串,问你由这n个字符串组成的大的字符串中那种组合方式
使得“sh”子串出现的次数最多,输出次数。
问题分析:
我们想要知道全部的子串的排序方式,我们就需要知道相邻的两个应该怎么放置
相邻的两个比较哪一个放置在前边要更优,这个问题和排序差不多,将大的数放在
前面,这里是将最适合的放在前面。
#include<bits/stdc++.h>
using namespace std;
#define N 1000005
#define LL long long
struct Node{
int s=0,h=0,sh=0;
string a;
bool operator<(const Node x)const{
LL A = 1ll*s*x.h+sh+x.sh;
LL B = 1ll*x.s*h+sh+x.sh;
return A>B;
}
}E[N];
int Nums[N],Numh[N];
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++){
cin>>E[i].a;
int len = E[i].a.length();
for(int j=0;j<len;j++){
if(E[i].a[j]=='s')E[i].s++;
else {E[i].h++;
E[i].sh+=E[i].s;}
}
}
sort(E,E+n);
LL res=0;
LL tmp=0;
for(int i=0;i<n;i++){
int len = E[i].a.length();
for(int j=0;j<len;j++){
if(E[i].a[j]=='s')tmp++;
else res+=tmp;
}
}
cout<<res;
}