xmu-1315 哈夫曼编码问题

  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <string.h>  
  4. #define MAX 200  
  5. long a[MAX],a1[MAX];  
  6. char str[100001];  
  7. long n,length;  
  8.   
  9. void Exchange(long *a,long *b)  
  10. {  
  11.     long temp=*a;  
  12.     *a=*b;  
  13.     *b=temp;  
  14. }  
  15. void Min_Heapify(long a[],long i)//保持最小堆性  
  16. {  
  17.     long l=i*2,r=i*2+1,min;  
  18.     if(l<=length&&a[l]<a[i])  
  19.          min=l;  
  20.     else  
  21.          min=i;  
  22.     if(r<=length&&a[r]<a[min])  
  23.     {  
  24.         min=r;  
  25.     }  
  26.     if(min!=i)  
  27.     {  
  28.         Exchange(&a[i],&a[min]);  
  29.         Min_Heapify(a,min);  
  30.     }  
  31. }  
  32. void Build_Min_Heap(long a[])//建堆  
  33. {  
  34.     int i;  
  35.     for(i=length/2;i>=1;i--)  
  36.     {  
  37.         Min_Heapify(a,i);  
  38.     }  
  39. }  
  40. void HeapSort(long a[])//堆排序  
  41. {  
  42.     long i;  
  43.     Build_Min_Heap(a);//堆一次,即每次取最小值  
  44.     /*for(i=n;i>=2;i--) 
  45.     { 
  46.         Exchange(&a[1],&a[length]); 
  47.         length-=1; 
  48.         Max_Heapify(a,1); 
  49.     }*/  
  50. }  
  51.   
  52. int main()  
  53. {  
  54.     long i,j;  
  55.     scanf("%s",str);  
  56.     memset(a,0,sizeof(a));  
  57.     memset(a1,0,sizeof(a1));  
  58.     for(i=0;str[i];++i)  
  59.     {  
  60.         if((str[i]>='A')&&(str[i]<='Z'))  
  61.         {  
  62.             ++a1[str[i]-'A'+1];  
  63.         }  
  64.         else  
  65.         {  
  66.             ++a1[str[i]-'a'+27];  
  67.         }  
  68.     }  
  69.     for(i=1,j=1;i<=55;++i)  
  70.     {  
  71.         if(a1[i]>0)  
  72.         {  
  73.             a[j++]=a1[i];  
  74.         }  
  75.     }  
  76.     length=j-1;  
  77.     n=length;  
  78.     long x,y,tp,sum=0;  
  79.     if(n==1)  
  80.     {  
  81.         printf("%d\n",a[1]);  
  82.         return 0;  
  83.     }  
  84.     for(i=1;i<=n-1;++i)  
  85.     {  
  86.         HeapSort(a);  
  87.         x=a[1];  
  88.         tp=a[1];  
  89.         a[1]=a[length];  
  90.         a[length]=tp;  
  91.         --length;  
  92.         HeapSort(a);  
  93.         y=a[1];  
  94.         a[1]=x+y;  
  95.         sum+=a[1];  
  96.     }  
  97.     printf("%ld\n",sum);  
  98.     /*for(i=1;i<=n;++i) 
  99.     { 
  100.         printf("%d ",a[i]); 
  101.     }*/  
  102.     return 0;  
  103. }  

你可能感兴趣的:(xmu-1315 哈夫曼编码问题)