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; }