| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
始终是Runtime Error,老哥们看看咋回事#include <iostream>
#include <string>
using namespace std;
#define N 30
int w[N];
string text;
typedef struct{
char ch;
int w,p,l,r;
}Node;
Node node[2*N];
int L_code[N];
void Coding(int m);
void Coding(int m){
int a,b; //记录当前权值最小两个节点的下标
//生成哈夫曼树
for(int i=m+1;i<=2*m-1;i++)
{
//找到当前a,b
int min=INT_MAX,c;
for(int j=1;j<i;j++)
{
if(node[j].p==0 && node[j].w!=0)
{
if(node[j].w<min)
{
min=node[j].w;
a=j;
c=j;
}
}
}
min=INT_MAX;
for(int j=1;j<i;j++)
{
if(node[j].p==0 && node[j].w!=0 && j!=c)
{
if(node[j].w<min)
{
min=node[j].w;
b=j;
}
}
}
node[a].p=i; node[b].p=i;
node[i].l=a; node[i].r=b; node[i].w=node[a].w+node[b].w;
}
}
void Length(int m);
void Length(int m){
for(int i=1;i<=m;i++)
L_code[i]=0;
for(int i=1;i<=m;i++){
int j;
j=i;
while(j!=2*m-1) //不是0,是2*m-1
{
L_code[i]++;
j=node[j].p; //***
}
}
}
int main(){
while(cin>>text){
if(text=="END") break;
//对w数组赋初值0
for(int i=1;i<=27;i++)
w[i]=0;
char n,m=0; //n为每组文本长度,m为字符种类数
n=text.length(); //或text.size();
//统计文本中字符的权值
for(int i=0;i<n;i++)
{
if(text[i]=='_')
w[27]++;
else
{
w[text[i]-'A'+1]++;
}
}
for(int i=1;i<=2*N;i++)
{
node[i].w =0;
node[i].p =0;
node[i].l =0;
node[i].r =0;
}
for(int i=1;i<=26;i++)
{
if(w[i]!=0)
{
m++;
node[m].ch = 'A'+i-1;
node[m].w=w[i];
}
}
if(w[27]!=0)
{
m++;
node[m].ch = '_';
node[m].w = w[27];
}
//*****不要忘了m==1,即只有一种字符的特殊情况!!!
if(m==1)
{
printf("%d %d %.1f\n",8*node[1].w,node[1].w,8*1.0);
continue;
}
//*************初始化了叶节点
//编码
Coding(m);
//统计每个字符哈夫曼编码长度
Length(m);
int sum=0;
for(int i=1;i<=m;i++)
sum=sum+L_code[i]*node[i].w;
printf("%d %d %.1f\n",8*n,sum,(8*1.0*n)/(1.0*sum));
//或double(n*8/sum)
}
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator