题目链接:#1385
这个题比1383好理解,也好过,因为不需要那么纠结的数据结构,随便暴力搞就好(但是一个模拟有80%的AC率你信不信)
题意:找到由空格分隔的两个单词(连续的多个空格当作一个),然后对这些单词都进行计数。
需要求的是出现次数最多的<单词+一个空格+单词>的格式的词组,而且要输出出现次数
首先想到的就是:暴力模拟
枚举每一个空格(后面连续的用另外的指针选择忽略掉)
然后用一个指针往左边扫描,用一个指针往右边扫描
得到一个词组
把这个词组放到map里查询一下,乱搞一发,注意细节就好
注意:h h h h这种的:最后答案是h h:3
代码如下:
#include<cstdio>
#include<stdio.h>
#include<cstring>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<cmath>
#include<map>
#include<string>
#include<iostream>
using namespace std;
const int maxn=5000;
char s[maxn];
string str,ans;
int maxlen;
map<string,int> mp;
int main(){
//freopen("input.txt","r",stdin);
mp.clear();
maxlen=0;ans="zzzzzzzzzzzzzzzzzz";
while(gets(s+1)){
if (s[1]=='#'){
cout<<ans<<":"<<maxlen<<endl;
maxlen=0;ans="zzzzzzzzzzzzzzzzzz";
mp.clear();
}
//cout<<s<<endl;
int len=strlen(s+1),i,j,k,jj,kk,pos;
s[0]=s[len+1]='#';
for(i=1;i<=len;i++)
if (s[i]==' '){
k=i;j=i-1;
while(s[k]==' ') k++;
jj=j-1;kk=k;
while(s[jj]>='a'&&s[jj]<='z') jj--;
while(s[kk]>='a'&&s[kk]<='z') kk++;
//if (jj==j) continue;
//if (kk==k) continue;
//if (jj==0) jj++;
str="";
for(pos=jj+1;pos<=j;pos++) str=str+s[pos];
str=str+' ';
for(pos=k;pos<kk;pos++) str=str+s[pos];
//cout<<str<<endl;
mp[str]++;
if ((mp[str]>maxlen)||(mp[str]==maxlen&&ans>str)){
maxlen=mp[str];
ans=str;
}
i=kk-1;
}
}
return 0;
}