#include<bits/stdc++.h> #define fi first #define se second #define int long long using namespace std; const int maxn=1e2+10; map<char,string> mp; map<string,char> pm; struct pos { char x; int num; pos *father=NULL; pos *lson=NULL; pos *rson=NULL; pos *p=NULL; friend bool operator < (pos a, pos b) { return a.num > b.num; //重载小于号使得小的先出队列 } }tree[maxn]; void make_DFS(pos &root,string ss) { if(root.lson==NULL && root.rson==NULL) { //cout<<root.x<<endl; mp[root.x]=ss; pm[ss]=root.x; } else { make_DFS(*root.lson,ss+"0"); make_DFS(*root.rson,ss+"1"); } } void build_tree(pos &root) { priority_queue<pos> qu; // pos 结构体 for(int i=0;i<=26;i++) { qu.push(tree[i]); } while(!qu.empty()) { pos *qq; qq=qu.top().p; qu.pop(); pos *pp; pp=qu.top().p; qu.pop(); if(qu.size()==0) { root.lson=pp; root.rson=qq; break; } (*pp).father=new pos; pos *x=(*pp).father; (*x).lson=pp; (*x).rson=qq; (*x).x='*'; (*x).num=(*pp).num+(*qq).num; //cout<<(*x).num<<endl; (*x).p=&(*x); qu.push(*x); } //cout<<"make tree OK"<<endl; make_DFS(root,""); } int32_t main() { freopen("tree.txt","r",stdin); tree[0].x=' '; for(int i=1;i<=26;i++) cin>>tree[i].x; for(int i=0;i<=26;i++) cin>>tree[i].num; for(int i=0;i<=26;i++) tree[i].p=&tree[i]; pos root; build_tree(root); for(int i=0;i<=26;i++) { cout<<tree[i].x<<" "<<tree[i].num<<" "<<mp[tree[i].x]<<" "<<pm[mp[tree[i].x]]<<endl; } char a[200]; getchar();gets(a); cout<<a<<endl; int l=strlen(a); cout<<"编码"<<endl; for(int i=0;i<l;i++)cout<<mp[a[i]];cout<<endl; gets(a); cout<<a<<endl; l=strlen(a); cout<<"编码"<<endl; for(int i=0;i<l;i++)cout<<mp[a[i]];cout<<endl; gets(a); cout<<a<<endl; l=strlen(a); cout<<"编码"<<endl; for(int i=0;i<l;i++)cout<<mp[a[i]];cout<<endl; cout<<"----------------------------------------"<<endl; gets(a); cout<<a<<endl; l=strlen(a); cout<<"译码"<<endl; string ss=""; for(int i=0;i<l;i++) { ss=ss+a[i]; if(pm[ss]==' '|| (pm[ss]>='A'&&pm[ss]<='Z')) { cout<<pm[ss]; ss=""; } }cout<<endl; gets(a); cout<<a<<endl; l=strlen(a); cout<<"译码"<<endl; ss=""; for(int i=0;i<l;i++) { ss=ss+a[i]; if(pm[ss]==' '|| (pm[ss]>='A'&&pm[ss]<='Z')) { cout<<pm[ss]; ss=""; } }cout<<endl; gets(a); cout<<a<<endl; l=strlen(a); cout<<"译码"<<endl; ss=""; for(int i=0;i<l;i++) { ss=ss+a[i]; if(pm[ss]==' '|| (pm[ss]>='A'&&pm[ss]<='Z')) { cout<<pm[ss]; ss=""; } }cout<<endl; }