题目链接:点击打开链接

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

Copy
4
ssh
hs
s
hhhs
output
18
input

Copy
2
h
s
output
1
Note

The optimal concatenation in the first sample is ssshhshhhs.

题意:给一堆由s和h组成的字符串,让你拼接,使得子序列为“sh”的数量最多,并且输出这个最多的值

题解:对于每个给的字符串,无论怎么拼接,它本身拥有的sh是不变的,而将str1与str2拼接之后(str1在前)增加的sh数量为str1中的s数量乘str2中的h数量。

由此,可以构造数据结构,每个字符串拥有“s数量、h数量、sh数量”三个变量,注意struct的使用方法以及初始化方式。

接下来要解决的问题就是如何进行拼接,既然整体的sh数量只根据拼接方式决定,我们可以让s多的在前面?显然不阔仪。

我们将问题进行简化:如何拼接两个字符串可以让sh最多?授衔,两个字符串分别私有的的sh数量是无论如何都不变的,我们只看拼接之后增加的sh数量如何最多即可。如上面说的,我们只需要比较“str1中的s数量乘str2中的h数量”与“str2中的s数量乘str1中的h数量”哪个最多即可,前者多则str1排在前面,后者多str2排在前面。

知道如何排序了,怎么实现数据结构的排序呢?阔仪自己写一个冒泡,no! algorithm中的sort函数是可以对复杂数据结构进行排序的,只是要自己定义比较函数,所以嘿嘿。。。下面介绍sort中的cmp怎么写

cmp函数是一个bool类型的函数,假如我们定义的数据结构叫sh,那么bool cmp(sh a,sh b)是我们要定义的比较函数,如果返回true,则a排在前面,否则b排在前面  

(加粗染红下划线)一定要注意cmp函数一定要保证涵盖了所有的情况!也就是说只要调用成功,cmp一定要有返回值出来,不然就会re。text 5 的噩梦。。

这题如果还有坑点的话,那就是日常char类型读入回车。。也很好解决,看代码

#include<cstdio>
#include<cstring>
#include<algorithm>
#define min(a, b) a>=b?b:a
#define max(a, b) a>=b?a:b
typedef long long ll;
using namespace std; struct sh{
ll ns;
ll nh;
ll nsh;
sh(): ns(0), nh(0), nsh(0){}
}str[100000+ 1000]; bool cmp(sh a, sh b){
if(a.ns * b.nh > a.nh * b.ns) return true;
else if(a.ns * b.nh < a.nh * b.ns) return false;
else {
if(a.ns > b. ns) return true;
else return false;
}
} int main(){
int n;
scanf("%ld", &n);
char d;
scanf("%c", &d);//接收回车符
for(int i = 0; i < n; i++){
while(1){ scanf("%c", &d);
if(d == 's') str[i].ns++;
else if (d == 'h') {str[i].nh++;str[i].nsh+=str[i].ns;}
else break;
} }
sort(str, str + n, cmp);
long long cnt = 0;
long long cnts = 0, cnth = 0;
for(int i = 0; i < n ; i++){
cnt+= str[i].nsh + cnts * str[i].nh;
cnts += str[i].ns;
}
printf("%lld\n", cnt);
return 0;
}

最新文章

  1. Java I/O and NIO [reproduced]
  2. php+mysql+Apache环境搭建
  3. Java用来进行批量文件重命名,批量提取特定类型文件
  4. Android实用代码七段(五)
  5. js 横幅播放
  6. 【Android开发日记】Popupwindow 完美demo
  7. form submit时将__VIEWSTATE和__VIEWSTATEGENERATOR一起post到另外的页面,出现验证视图状态 MAC 失败。
  8. jQuery源代码学习之八——jQuery属性操作模块
  9. [CF148E] Porcelain (分组背包)
  10. 图的遍历之深度优先搜索(DFS)
  11. Attach source code to a Netbeans Library Wrapper Module
  12. WP开发笔记——程序的退出方法
  13. 移动平台3G手机网站前端开发布局技巧
  14. 解决MYSQL 8小时连接问题
  15. python 在 for i in range() 块中改变 i 的值的效果
  16. MariaDb数据库管理系统学习(二)使用HeidiSQL数据库图形化界面管理工具
  17. TCP/IP,http,socket,长连接,短连接——小结。
  18. 【最长下降子序列的长度和个数】 poj 1952
  19. sql server 2008 把远程的数据库的数据转移到本地数据数据库里
  20. Word常用实用知识3

热门文章

  1. 一起来立Flag吧!超炫的数据图表分析 2020 年 Java 技术趋势
  2. Quartz 和 springboot schedule中的cron表达式关于星期(周几)的不同表示
  3. C语言关键字const作用及其应用
  4. python之字符串的简单应用
  5. 基于 HTML5 + WebGL 的 3D 风力发电场
  6. JS中如何比较两个数组,取得数组二相对于数组一新增和去除的元素
  7. 牛客暑期ACM多校 第七场
  8. 区间dp - 括号匹配并输出方案
  9. 《C# 爬虫 破境之道》:第一境 爬虫原理 — 第五节:数据流处理的那些事儿
  10. MongoDB聚合(aggregate)