给出几个串,然后统计相邻两个字母在总串中出现的次数,然后统计处个数最多的5个,并写出他们的频率
猛一看感觉没头绪,是否要枚举每一种,感觉挺繁琐,但是先把两个字符串给hash出来,即前一个字母*256+后一个字母,得出的和即可表示所有两个ascii组合的hash值
然后再按照每个hash值上的出现次数排序,由于题目要求树木相同的按照ascii字典排序,所以数目同的再按照他们的hash即可,因为hash值就是两个字母ascii的从小到大的组合
其实有点统计字符串字母个数的问题,num[str[i]-'a']++的意思,这个是一个字母,统计两个的时候再hash下就ok
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
#define inf 256*256
char c[6400];
struct point{ int num,ct;}p[inf+1];
int cmp(point p1,point p2)//先按照数量排序,其次按阿斯玛最小的,第一个乘以256+第二个,其和即是按两个字母组合的
//ascii字典顺序排列的,需要256*256的大小空间即可
{ return p1.ct>p2.ct||(p1.ct==p2.ct&&p1.num<p2.num);}
int main()
{ int n;
while(scanf("%d",&n)!=EOF&&n)
{ getchar();
int i,j=0,len;
char s[85];
for(i=0;i<=inf;i++)
{
p[i].ct=0;
p[i].num=i;
}
while(n--)
{
gets(s);
len=strlen(s);
for(i=0;i<len;i++)
c[j++]=s[i]; }
c[j++]='\0';
len=strlen(c);
for(i=1;i<=len;i++)
p[c[i-1]*256+c[i]].ct++;
len--;
sort(p,p+inf,cmp);
for(i=0;i<5;i++)
{
int t=p[i].num;
printf("%c%c %d %.6lf\n",t/256,t%256,p[i].ct,p[i].ct*1.0/len);
} printf("\n"); }
}