题目链接:#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;
}