题意: 给一个字符串,求出该字符串的哈夫曼编码的总长度。
分析:由于没考虑树中只有一个字符的情况又WA了N 久T-T ,最近总是犯脑残的错误啊。
关于哈夫曼编码 可以看这个.... 留着复习...
http://www.thecodeway.com/blog/?p=870
#include<cstring> #include<cstdio> #include<queue> #include<algorithm> #define clr(x)memset(x,0,sizeof(x)) using namespace std; struct node { double w; int ls,rs; }tr[1000000]; int tot; struct Tree { int num; double wi; const bool operator < (Tree a)const{ return a.wi<wi; } }t1,t2,tt; char s[1000000]; double v[30]; double res; void dfs(int r,double c) { if(r<=26) { res+=c*tr[r].w; return; } dfs(tr[r].ls,c+1); dfs(tr[r].rs,c+1); } int main() { //freopen("D:ce.txt","r",stdin); int i,flag; double len,g; while(gets(s)) { if(strcmp(s,"END")==0) break; flag=0; priority_queue<Tree>q; len=strlen(s)*8; printf("%.0lf ",len); tot=27; for(i=0;i<=26;i++) v[i]=0; for(i=0;s[i];i++) { if(s[i]=='_') v[26]+=1; else v[s[i]-'A']+=1; } for(i=0;i<=26;i++) if(v[i]) { t1.num=i; t1.wi=v[i]; q.push(t1); flag++; g=v[i]; } if(flag==1) { printf("%.0lf %.1lf\n",g,len/g); continue; } while(q.size()!=1) { t1=q.top(); q.pop(); t2=q.top(); q.pop(); tt.num=++tot; tt.wi=t1.wi+t2.wi; q.push(tt); tr[t1.num].w=t1.wi; tr[t2.num].w=t2.wi; tr[tt.num].ls=t1.num; tr[tt.num].rs=t2.num; tr[tt.num].w=tr[t1.num].w+tr[t2.num].w; } res=0; dfs(tot,0); if(len==8) res=1; printf("%.0lf %.1lf\n",res,len/res); } return 0; }