大体思路是字符串按行输出(这里注意getchar()),每一行用set保存话题(便于去重),然后把每一行出现的话题放入map集合中,因为map我不太会排序,转化一下思路,遍历map,将每一个map对转化成pair存入vector数组,这样就可以排序了,然后输出就可以。不过肯定有写细节需要注意了,比如在向集合里存话题时,将非英文字母非数字的字符全部转化为空格,多个空格合并成一个空格,否则就会格式错误。
#include <bits/stdc++.h>
#define INF 1e10
using namespace std;
typedef long long ll;
map<string,int> ma;
map<string,int>::iterator qq;
set<string> s;
set<string>::iterator it;
vector<pair<string,int> > pa;
bool cmp(pair<string,int> a, pair<string,int> b)
{
if(a.second == b.second)
return a.first<b.first;
return a.second > b.second;
}
int main()
{
int n;
cin>>n;
getchar();
while(n--)
{
s.clear();
int l,l1 = -1,l2 = -1;
string buf;
getline(cin,buf);
l = buf.size();
char p[150];
for(int i = 0;i < l;i++)
{
//取出话题
if(buf[i] == '#' && l1 == -1)
{
l1 = i;
}
else if(buf[i] == '#' && l1 != -1)
l2 = i;
if(l2 != -1)
{
memset(p,0,sizeof(p));
//printf("%dgg\t%dgg\n",l1,l2);
int num = 0;
for(int j = l1 + 1;j < l2;j++)
{
//cout<<buf[j];
if(isalpha(buf[j]) || isdigit(buf[j]))
{
//cout<<buf[j];
if(isupper(buf[j]))
{
buf[j] = (char)('a' - 'A' + (int)buf[j]);
//cout<<buf[j];
}
//这里注意因为最后输出用一个空格分隔原文中的单词,所以多个空格合并成一个空格
if(buf[j-1] == ' ') p[num++] = ' ';
p[num++] = buf[j];
}
else buf[j] = ' ';
}
//cout<<p<<endl;
l1 = l2 = -1;
s.insert(p);
}
}
for(it = s.begin();it != s.end();it++)
{
string q = *it;
//cout<<q<<endl;
ma[q]++;
}
}
for(qq = ma.begin();qq != ma.end();qq++)
{
pair<string,int> r;
r.first = qq->first;
r.second = qq->second;
pa.push_back(r);
}
sort(pa.begin(),pa.end(),cmp);
int num = pa[0].second;
string x = pa[0].first;
x[0] = (char)(x[0] + 'A' - 'a');
int oth = 0;
for(int i = 1;i < pa.size();i++)
{
if(pa[i].second == num)
oth++;
}
cout<<x<<endl;
printf("%d\n",num);
if(oth)
{
printf("And %d more ...\n",oth);
}
return 0;
}