(第9题) 哈夫曼编码大全(难度100)

题目描述208:

题目: 哈夫曼编码大全

描述:

关于哈夫曼树的建立,编码,解码。

输入

第一行输入数字N,代表总共有多少个字符以及权值

第二第三行分别是一行字符串,以及每个字符对应的权值

接下来输入一个数M,表示接下来有M行字符串,要求你对每个字符串进行编码

再输入一个数X,表示接下来有X行编码,要求你对每行编码进行解码

输出

第一行输出所有节点的权重

接下来输出N行,每行以 “a:001”的格式输出每个字符对应的编码

接着输出M行,对输入的字符串的编码结果

最后,输出X行的解码结果

输入样例

6
abcdef
50 10 5 5 20 10
2
abcdef
defabaabbc
2
011001100100110110101101100
1100011000110101100101100

输出样例

50 10 5 5 20 10 10 20 30 50 100
a:0
b:100
c:1100
d:1101
e:111
f:101
010011001101111101
11011111010100001001001100
accbdfadb
cacadacfb

#include

using namespace std;

const int N = 10010;

int n;
string s,ans[N];
int w[N],idx=1;//节点权值
int a[N],cnt;//存建成树前的编号 
int l[N],r[N];
bool cmp(int x, int y)
{
	//从大到小排序 
	if(w[x] != w[y]) return w[x] > w[y];//先根据权重排序 
	return x > y; //权重相同根据编号排序 
}

void dfs(int u, string ss)
{
	if(!l[u] && !r[u])//找到叶节点 
	{
		ans[u] = ss;
		return;
	}
	
	dfs(l[u], ss + "0");
	dfs(r[u], ss + "1");
}

int main()
{
	cin>>n;
	cin>>s;
	for(int i=1;i<=n;i++)
	{
		int x;
		cin>>x;
		idx++;
		a[cnt++] = i;
		w[i] = x;
	}

	while(cnt > 1)//循环建树 
	{ 
		sort(a, a+cnt, cmp);
		//第一次排序后
		//a e f b d c      s:字符 
		//50 20 10 10 5 5  w:权值 
		// 1  5  6  2 4 3  a:编号 
		int num1 = a[cnt-1];//新节点左子树 
		int num2 = a[cnt-2];//新节点右子树 
		
		a[cnt-2] = idx++;//新节点编号 
		w[a[cnt-2]] = w[num1] + w[num2]; //新节点权重 

		l[a[cnt-2]] = num1;
		r[a[cnt-2]] = num2;
		cnt--; 
	}
	 
	dfs(a[0], "");//a[0]为根节点//递归找叶节点 并存下编码 
	
	//输出所有节点权重 
	for(int i=1;i>m;//输出编码 
	while(m--)
	{
		string sh;
		cin>>sh; 
		for(int i=0;i>m;//输出解码 
	while(m--)
	{
		string sh;
		cin>>sh;
		string hh = "";
		for(int i=0;i

你可能感兴趣的:(数据结构,c++)