方法一:
#include <cstring>
#include <iostream>
using namespace std;
int maxn=0,t[110];
int main()
{
int n;
cin>>n;
string sos;
string name[110];
//开始统计
for (int i = 1; i <= n; i ++)
{
cin >> name[i] >> sos;
int len = sos.length();
for (int j = 0; j < len; j ++)
{
if (sos[j] == 's' && sos[j + 1] == 'o' && sos[j + 2] == 's')
t[i] ++;
maxn = maxn > t[i] ? maxn : t[i];//找sos出现次数最多的一次
}
}
for (int i = 1; i <= n; i ++)
if (t[i] == maxn)
cout << name[i] <<" ";
cout<<endl<<maxn;
return 0;
}
方法二:
#include<bits/stdc++.h>
using namespace std;
int n;
struct node{
string name,help;
int s,num;
//name 是求助者的名字
//help 是求助者的求助信息
//s 是求助信息中子串 sos 的数量
//num 是求助者的顺序
}str[105];
int find(string qwq){ //寻找子串 sos 的数量
int len=qwq.size(); //提取出这个字符串的长度STL 大法好QwQ
int anss=0; //子串 sos 的数量
for(int i=0;i<len-2;i++){ //从头到尾枚举
if(qwq[i]=='s'&&qwq[i+1]=='o'&&qwq[i+2]=='s'){ //如果这里有一个 sos
anss++; //子串 sos 的数量+1
}
}
return anss; //返回子串 sos 的数量
}
bool cmp(node p,node q){ //比较函数 cmp
if(p.s==q.s){ //如果两个求助信息中的子串 sos 的数量都相同
return p.num<q.num; //按照输入顺序排序
}
return p.s>q.s; //否则按照求助信息中的子串 sos 的数量排序
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0); //黑科技cin,cout加速
cin>>n;
for(int i=1;i<=n;i++){
cin>>str[i].name>>str[i].help;
str[i].s=find(str[i].help);
str[i].num=i;
}
sort(str+1,str+n+1,cmp); //STL 大法好QWQ
int tmp=str[1].s; //排序之后最前面的那个自然就是子串 sos 最多的啦QwQ直接记录即可。
for(int i=1;i<=n;i++){
if(str[i].s!=tmp){ //如果子串 sos 的数量少于 tmp
break; //立刻退出循环停止输出
}
cout<<str[i].name<<" ";
}
cout<<endl<<tmp; //别忘了换行哦
return 0;
}