void-man

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

给出几个串,然后统计相邻两个字母在总串中出现的次数,然后统计处个数最多的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"); }
}
posted on 2011-04-17 13:54  void-man  阅读(333)  评论(0)    收藏  举报