一道蛮好的贪心题。。

首先显然会想到如果只有s就放最前,只有h就放最后。。

然后当然是希望s尽可能往前放。。所以猜想s是不是多的就有限优先往前放?

然后发现貌似有点问题,如果s和h都一样多要怎么办?

像ssh和hss,一眼觉得是ssh往前放就可以。。然而这2个顺序颠倒也是一样的。。

所以这个结论貌似成立?

所以按照了s个数-h个数这个指标来排序。。

调样例的时候发现s的数量比sssh靠后,显然不对。。

然后又想了下,s和ss其实都一样要放最前,且优先级应该是一样的。。有什么指标能来解决呢。。

然后想到用密度来解决,即s/(s+h)。。这样能保证像ss、s和ssh、hss这样的例子都成立。。

样例过了。。交。。然后发现没开ll...

开ll...AC...然后至于这贪心策略要怎么证明窝也不会。。如果有人会的话欢迎指正_(:зゝ∠)_

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<queue>
#include<cmath>
#define inc(i,l,r) for(int i=l;i<=r;i++)
#define dec(i,l,r) for(int i=l;i>=r;i--)
#define link(x) for(edge *j=h[x];j;j=j->next)
#define eps 1e-8
#define inf 1e9
#define mem(a) memset(a,0,sizeof(a))
#define ll long long
#define succ(x) (1<<x)
#define lowbit(x) (x&(-x))
#define sqr(x) ((x)*(x))
#define ls T[i<<1]
#define rs T[i<<1|1]
#define op T[i]
#define mid (x+y>>1)
#define NM 1000005
#define nm 100498
#define pi 3.1415926535897931
using namespace std;
ll read(){ll x=0,f=1;char ch=getchar();while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}while(isdigit(ch))x=x*10+ch-'0',ch=getchar();return f*x;
}ll ans,a[NM],b[NM];
int n,cnt,tot,tmp[NM];
string s[NM];
char t[NM];
bool cmp(int x,int y){return (ll)a[x]*(a[y]+b[y])>(ll)a[y]*(a[x]+b[x]);}
int main(){n=read();inc(i,1,n)cin>>s[i];inc(i,1,n)inc(j,0,s[i].length()-1)if(s[i][j]=='s')a[i]++;else b[i]++;inc(i,1,n)tmp[i]=i;sort(tmp+1,tmp+1+n,cmp);inc(k,1,n){int i=tmp[k];inc(j,0,s[i].length()-1)t[++cnt]=s[i][j];}//printf("%s",t+1);inc(i,1,cnt)if(t[i]=='s')tot++;else ans+=tot;printf("%I64d\n",ans);return 0;
}
time limit per test

1 second

memory limit per test

256 megabytes

input

standard input

output

standard output

Pushok the dog has been chasing Imp for a few hours already.

Fortunately, Imp knows that Pushok is afraid of a robot vacuum cleaner.

While moving, the robot generates a string t consisting of letters 's' and 'h', that produces a lot of noise. We define noise of string t as the number of occurrences of string "sh" as a subsequence in it, in other words, the number of such pairs (i, j), that i < j and and .

The robot is off at the moment. Imp knows that it has a sequence of strings ti in its memory, and he can arbitrary change their order. When the robot is started, it generates the string t as a concatenation of these strings in the given order. The noise of the resulting string equals the noise of this concatenation.

Help Imp to find the maximum noise he can achieve by changing the order of the strings.

Input

The first line contains a single integer n (1 ≤ n ≤ 105) — the number of strings in robot's memory.

Next n lines contain the strings t1, t2, ..., tn, one per line. It is guaranteed that the strings are non-empty, contain only English letters 's' and 'h' and their total length does not exceed 105.

Output

Print a single integer — the maxumum possible noise Imp can achieve by changing the order of the strings.

Examples
Input
4
ssh
hs
s
hhhs

Output
18

Input
2
h
s

Output
1

Note

The optimal concatenation in the first sample is ssshhshhhs.

cf922D(贪心)相关推荐

  1. CF922D Robot Vacuum Cleaner 贪心+排序

    正确的贪心方法:按照比例排序. code: #include <bits/stdc++.h> #define N 200000 #define ll long long #define s ...

  2. 算法设计与分析第3章 贪心算法

    第4章 贪心算法 贪心算法总是作出在当前看来最好的选择.也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择. 贪心算法的基本要素 1.贪心选择性质 所谓贪心选择性质是指所 ...

  3. 贪心算法单源点最短路径例题c语言源代码,Dijkstra算法是解单源最短路径问题的一个贪心算法...

    问题描述 给定一个带权有向图 G=(V,E) ,其中每条边的权是一个非负实数. 另外,还给定 V 中的一个项点,称为源. 现在我们要计算从源到所有其他各项点的最短路径长度. 这里的长度是指路上各边权之 ...

  4. Too Many Segments CF595D 贪心乱搞

    传送门! 比赛的时候没有时间写了,看看了看大佬的代码,学习学习. 一开始实验室大佬说是用差分写的,但是看了代码发现打cf的人大家都是stl狂魔! 贪心思路:区间按照左端点排序,从1~2e5遍历每一个点 ...

  5. Roundgod and Milk Tea 贪心

    这个题好像可以用一种类似与置换的贪心方法来做~ sum记为剩余奶茶,一开始sum等于奶茶和 ans记录已经喝的奶茶数 不用排序,我们就从前往后直接处理,考虑的是每一个班最多可以喝多少杯奶茶 就是从剩余 ...

  6. 贪心算法简单实践 -- 分糖果、钱币找零、最多区间覆盖、哈夫曼编解码

    1. 贪心算法概览 贪心算法是一种算法思想.希望能够满足限制的情况下将期望值最大化.比如:Huffman编码,Dijkstra单源最短路径问题,Kruskal最小生成树 等问题都希望满足限制的情况下用 ...

  7. 贪心:expedition 最优加油方法

    已知一条公路上,有一个起点与一个终点,这之间有n个加油站;已知从这n个加 油站到终点的距离d与各个加油站可以加油的量l,起点位置至终点的距离L与起 始时刻油箱中汽油量P;假设使用1个单位的汽油即走1个 ...

  8. 贪心:Burst Balloons 最少次数完成射击气球

    已知在一个平面上有一定数量的气球,平面可以看作一个坐标系,在平面的x轴的不同位 置安排弓箭手向y轴方向射箭,弓箭可以向y轴走无穷远;给定气球的宽度 xstart ≤ x ≤ xend,问至少需要多少弓 ...

  9. 贪心:jump 游戏(获取最少跳跃的次数以及跳跃路径)

    一个数组存储了非负整型数据,数组中的第i个元素a[i],代表了可以从数组第i个 位置最多向前跳跃a[i]步;已知数组各元素的情况下,求是否可以从数组的第0个位置跳跃到数组的最后一个元素的位置,返回最少 ...

最新文章

  1. 全面解析微服务系统监控分层,啃透服务治理核心!
  2. Java PriorityQueue实现大顶堆
  3. java基础习题集_java基础集合经典训练题
  4. 【python】Python遍历dict的key最高效的方法是什么?
  5. python 栈和队列_Python实现栈和队列的简单操作方法示例
  6. 抽象工厂产品等级结构与产品族
  7. Sphinx——自动生成Python文档
  8. 最新性能测试:Kafka、Pulsar 和 Pravega 哪个最强?
  9. Flutter 入门指北(Part 9)之弹窗和提示(SnackBar、BottomSheet、Dialog)
  10. GPU服务器硬件及软件
  11. 基于灰度的图像匹配算法
  12. 基于微信小程序的停车位预约系统设计与实现毕业设计毕设开题报告
  13. 学校的计算机是作文,我在学校作文
  14. 企企通SRM:由“制造”到“智造”,高科技电子行业如何打造智慧供应链?
  15. 《两日算法系列》之第四篇:隐马尔可夫模型HMM
  16. iis服务器.webp文件无法访问的解决办法
  17. 【云扩RPA】CreateFirstAutomationProject
  18. 达内2016前端开发知识点总结--ajax php mysql--9天
  19. 面试(十一)富途笔试题
  20. linux环境变量设置图解,Ubuntu Linux 各个环境变量配置文件详解, 环境变量PATH设置...

热门文章

  1. 《图解密码技术》分组密码(4) 密文反馈CFB模式
  2. 各省全国计算机二级考试报名费一览表,为什么广东计算机考证最贵?
  3. 身份证+银行卡识别的行业应用
  4. 当前时间对应的286的点
  5. linux查看IP的几种方式;nmcli的使用
  6. 金山区级众创空间给予20万元资助
  7. VS Code Remote Development插件的需求分析和逆向工程
  8. 蓝桥杯省赛 冶炼金属 二分 推公式
  9. Discuz论坛搭建详细过程,一看就懂
  10. 最大子数组和——动态规划法