#include<stdio.h> #include<string.h> #include<queue> using namespace std; char s[100005]; int t; struct dian { friend bool operator < (dian n1,dian n2) { return (n1.x>n2.x); } int node,l,r,x; }; dian n[105],n1,n2; int dfs(int no,int depth) { if (n[no].l==-1) return(depth*n[no].x); else return(dfs(n[no].l,depth+1)+dfs(n[no].r,depth+1)); } int main() { int T,m,len,i,tt,sum,hash[105]; priority_queue<dian>q; while (~scanf("%d",&T)) while (T--) { scanf("%d",&m); getchar(); memset(hash,0,sizeof(hash)); scanf("%s",s); len=strlen(s); for (i=0;i<len;i++) hash[s[i]-'a']++; t=0; while (!q.empty()) q.pop(); for (i=0;i<26;i++) if (hash[i]!=0) { t++; n[t].x=hash[i]; n[t].node=t; n[t].l=n[t].r=-1; q.push(n[t]); } tt=t; while (q.size()!=1) { n1=q.top(); q.pop(); n2=q.top(); q.pop(); tt++; n[tt].x=n1.x+n2.x; n[tt].node=tt; n[tt].l=n1.node; n[tt].r=n2.node; q.push(n[tt]); } sum=dfs(tt,0); // for (i=1;i<=tt;i++) printf("%d %d %d %d\n",n[i].node,n[i].x,n[i].l,n[i].r); // printf("%d\n",sum); if ((sum<=m&&t!=1)||(t==1&&n[1].x<=m)) printf("yes\n"); else printf("no\n"); } }
转载于:https://www.cnblogs.com/xiao-xin/articles/3848645.html