题目描述
救助中心每天都要收到很多求救信号。收到求救信号后,救助中心会分析求救信号,找出最紧急的求救者给予救助。求救信号是一个由小写英文字母组成的字符串,字符串中连续三个字符依次组成"sos"的情况越多(即包含子串"sos"的数目越多),代表着求救者情况越紧急。现在请你帮助救助中心找出最紧急的求救者。注意字符串中包含的"sos"可以有重叠,例如"sosos"算作包含 2 个"sos"。
输入
第一行一个整数 n,表示求救者的数目。
接下来有 2n 行,每行一个由小写英文字母组成的字符串。这 2n 行中,第 2i−1(1≤i≤n)行的字符串表示第 i 个求救者的名字,第 2i 行的字符串表示第 i 个求救者的求救信号。
输出
输出共两行,第一行是最紧急求救者的名字。如果最紧急求救者有多个,则按照输入的顺序将他们的名字依次输出,相邻两个名字间用空格分隔。第二行一个整数,表示最紧急求救者的求救信号中包含有多少个"sos"子串。
样例输入
样例输入1
2
adam
ineedhelpsosineedhelpsos
mark
ineedmorehelpsoshelpmesossoshelpme
样例输入2
3
susan
sosososososos
jack
sossossossos
allen
soshelpsossossossossos
样例输出
样例输出1
mark
3
样例输出2
susan allen
6
数据范围限制
对于 10% 的数据,n=1。
对于所有数据,n≤100,求救者名字长度不超过 20,求救信号长度不超过 200。
分析:
很简单的字符串处理 注意有多个最紧急求助者
CODE:
#include<cmath>
#include<iomanip>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<iostream>
using namespace std;
typedef long long LL;
struct peo{ //结构体
char name[21];
char str[201];
int cnt;
}a[101];
int n,maxn=-999;
int main(){
freopen("save.in","r",stdin);
freopen("save.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++){
cin>>a[i].name>>a[i].str;
}
for(int i=1;i<=n;i++){
for(int j=0;j<strlen(a[i].str);j++)
{
if(a[i].str[j]=='s'&&a[i].str[j+1]=='o'&&a[i].str[j+2]=='s') a[i].cnt++;
} //判断sos,计数
}
for(int i=1;i<=n;i++){
if(maxn<a[i].cnt) maxn=a[i].cnt; //最大数量
}
for(int i=1;i<=n;i++){
if(a[i].cnt==maxn){
cout<<a[i].name<<" "; //匹配就输出
}
}
cout<<endl;
cout<<maxn;
return 0;
}