map,set 这些STL的数据结构函数还是很强大的。
这道题只要把符合格式的词组提取出来,存进SET里面,最后count下重复最多的词组就好了,set已经安字典序帮你排好了。
<span style="font-size:18px;">#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<set>
#include<string>
using namespace std;
multiset<string> q; //multiset可以允许存在重复的元素
string str[55][550];
int cline[55];
string aa[250000],b;
int ans[250000];
int main() {
char a[505];
int cnt = 0;
memset(cline,0,sizeof(cline));
while(gets(a)) {
if(a[0] == '#') {
/*for(int i = 0;i < cnt;i++) {
for(int j = 0;j < cline[i];j++) {
cout<<str[i][j]<<' ';
}
printf("\n");
}
printf("%d\n",cline[0]); */
for(int i = 0;i < cnt;i++) {
for(int j = 0;j < cline[i]-1;j++) {
string fuck;
if(str[i][j] != "," && str[i][j+1] != ",") {
fuck = str[i][j] + " " + str[i][j+1];
q.insert(fuck);
}
}
}
multiset<string>::iterator it;
int s = 0,ttt = 0,xia;
memset(ans,0,sizeof(ans));
for(it = q.begin();it != q.end();it++) {
string c = *it;
if(c == aa[s])
ans[s]++;
else {
s++;
aa[s] = c;
ans[s]++;
}
//cout<<a<<endl;
}
for(int i = 1;i <= s;i++) {
if(ans[i] > ttt) {
ttt = ans[i];
xia = i;
}
}
cout<<aa[xia]<<':'<<ttt<<endl;
memset(cline,0,sizeof(cline));
cnt = 0;
q.clear();
s = 0;
}
else {
int t = strlen(a),cc = 0;
char tmp[505];
for(int i = 0;i < t;i++) {
if(a[i] == ' ' || a[i] == ',') {
tmp[cc] = 0;
if(cc == 0) {
if(a[i] == ',' || a[i] == '.')
str[cnt][cline[cnt]++] = ',';
continue;
}
str[cnt][cline[cnt]++] = tmp;
if(a[i] == ',' || a[i] == '.')
str[cnt][cline[cnt]++] = ',';
cc = 0;
}
else
tmp[cc++] = a[i];
}
tmp[cc] = 0;
str[cnt][cline[cnt]++] = tmp;
cnt++;
}
}
}</span>
用了set这道题还是很简单的,还是要多学学强大的STL,嗯