2569 Etaoin Shrdlu

問題概要

文字列が与えられる。
連続する二文字について、頻度の多い順に5つを出力せよ。


ただし、改行文字およびEOFは無視する。

解法

改行コードとEOFに気をつけて数える。

ソースコード

struct P{
	char a,b; int f;
	P(int a=0,int b=0,int f=0):a(a),b(b),f(f){}
	bool operator<(const P &r)const{
		if(f!=r.f)return f>r.f;
		return a!=r.a?a<r.a:b<r.b;
	}
}cnt[256*256];
int l,n; char s[99],in[5000];

int main(){
	while(scanf("%d ",&l),l){
		rep(i,256)rep(j,256)cnt[i*256+j]=P(i,j,0);
		in[0]=n=0;
		rep(i,l){
			gets(s);
			for(int i=0;s[i]>=' ';i++)in[n++]=s[i];
		}
		rep(i,n-1)cnt[in[i]*256+in[i+1]].f++;
		sort(cnt,cnt+256*256);
		
		rep(i,5)printf("%c%c %d %.6f\n",cnt[i].a,cnt[i].b,cnt[i].f,cnt[i].f*1.0/(n-1));
		puts("");
	}
	return 0;
}