题意:我不想说话。。一直看错题做了一个早上。。还觉得自己很对。。
简单说就是给出的频数是可以叠加的。如第一组测试数据hell的3和hello的4是可以叠加为hell为7,当然hello仍为4.就是这样。。。直接贴代码好了。。我不想说这道题,我心好累...

#include
#include
#include
#include
using namespace std;
struct trie{
int next[27];
int pro;
int end;
char print[110];
int edge;
}tree[1000*100+10],Q[1000*100+10];
char printer[110];
void add(char printer[],int temp,int len)
{
printer[len]=temp+'a';
printer[len+1]='\0';
}
int store[1010];
int cnt;
int dig[10]={0,0,3,3,3,3,3,4,3,4};
char s[110],num[110],ans[1010][110];
char searches[10][5]={"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
//要开【5】的,最后有\0符 = =.
void insert(char *s,int now,int pro,int rank)
{
printer[0]='\0';
for(;*s;s++)
{
int p=*s-'a';
if(tree[now].next[p]==0)
{
tree[now].next[p]=cnt++;
}
now=tree[now].next[p];
tree[now].pro+=pro;
int len=strlen(printer);
add(printer,p,len);
strcpy(tree[now].print,printer);
//将每层应输出的保存下来。很浪费空间,但是不易出错。
}
tree[now].end=rank;
}
int t,digt;
void bfs(char *s)
//每层之间其实没有太大联系,为了完整搜到每种情况,不用dfs,用bfs较好
{
int begin=0,end=0;
Q[end++].edge=1;
memset(store,0,sizeof(store));
for(;*s;s++)
{
int nnn=0,max=0,flag;
int p=*s-'0';
if(p==1)
{
break;
}
while(begin
max)//保存含最大权值的节点的编号及其值。
//值只是为了不断比较是否之前保存下来的节点对应的是最大的。
{
max=tree[t].pro;
flag=t;
}
}
}
}
if(nnn!=0)//只要搜到了匹配的,nnn就不会为初值0,会对应有输出
{
printf("%s\n",tree[flag].print);
digt++;//统计一下输出了多少个字母的行了
}
for(int i=0;i