哈夫曼树+搜索

抄了抄代码

先开始不知道怎么限制哈夫曼树,然后看了看代码,是用bfs序来限制。因为每个节点的右子树节点肯定不小于左儿子,同一层也是。所以先搞出bfs序,然后搜索,判断每一层右边是否大于左边。

哈夫曼树的每个节点必然会有零个或两个儿子,这也是判断无解或有解的情况。

#include<bits/stdc++.h>
using namespace std;
const int N = ;
string s;
int n, cnt, ans, root, now, kase;
int child[N][], val[N], pos[N];
vector<int> order;
void insert(int x)
{
for(int i = ; i < s.length(); ++i)
{
int t = s[i] - '';
if(!child[x][t])
child[x][t] = ++cnt;
x = child[x][t];
}
}
void dfs(int u)
{
if(pos[u] == order.size() - )
{
++ans;
return;
}
if(child[u][] == )
{
dfs(order[pos[u] + ]);
return;
}
for(int i = ; i * <= val[u]; ++i)
{
val[child[u][]] = i;
val[child[u][]] = val[u] - i;
if(val[order[pos[child[u][]] - ]] && val[order[pos[child[u][]] - ]] < val[child[u][]]) continue;
dfs(order[pos[u] + ]);
}
val[child[u][]] = val[child[u][]] = ;
}
bool build()
{
for(int i = ; i <= cnt; ++i) if(child[i][] * child[i][] == && child[i][] + child[i][])
return ;
queue<int> q;
order.clear();
q.push();
while(!q.empty())
{
int u = q.front();
q.pop();
pos[u] = order.size();
order.push_back(u);
if(child[u][]) q.push(child[u][]);
if(child[u][]) q.push(child[u][]);
}
return true;
}
int main()
{
while(cin >> n)
{
if(!n)
break;
memset(child, , sizeof(child));
ans = ;
cnt = ;
root = ++cnt;
for(int i = ; i <= n; ++i)
{
cin >> s;
insert(root);
}
printf("Case %d: ", ++kase);
if(!build())
{
puts("");
continue;
}
val[] = ;
dfs();
cout << ans << endl;
}
return ;
}

LA4122的更多相关文章

随机推荐

  1. 三角形状的点阵模糊效果iOS源码

    源码FFAngularPointilism,FFAngularPointilism能够将UIImageView像添加滤波器一样生成三角形状的点阵模糊效果.可以通过动画方式来模糊,也可以立刻模糊.另外并 ...

  2. day02-操作系统、编程语言分类及python安装

    目录 操作系统 编程语言分类 安装python解释器 操作系统 操作系统有什么用 操作系统能接受外部指令转化成0和1,并把一些对硬件的复杂操作简化成一个个简单的接口,作为中间人连接硬件和软件 计算机三 ...

  3. Python 之mysql类封装

    import pymysql class MysqlHelper(object): conn = None def __init__(self, host, username, password, d ...

  4. bootstrapValidator代码中开启验证和判断验证是否通过

    //开启验证 $('#saveadmin_form').data('bootstrapValidator').validate(); //是否通过校验 if(!$('#saveadmin_form') ...

  5. Lua练习题集嚢

    --1.table.sort() am = {"cc","nn","ll","dd"} arr = function ( ...

  6. 第一节:web爬虫之requests

    Requests库是用Python编写的,并且Requests是一个优雅而简单的Python HTTP库,在使用Requests库时更加方便,可以节约我们大量的工作,完全满足HTTP测试需求.

  7. 【模板】最小生成树Kruskal

    洛谷3366 #include<cstdio> #include<algorithm> using namespace std; ,maxm=; ,ans=; struct e ...

  8. mybatis源码阅读-初始化过程(七)

    说明 mybatis初始化过程 就是解析xml到封装成Configuration对象 供后续使用 SqlSessionFactoryBuilder 代码例子 SqlSessionFactoryBuil ...

  9. 洛谷 P1972 BZOJ 1878 [SDOI2009]HH的项链

    题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH 不断地收集新的贝壳,因此,他的项链变得越来越长. ...

  10. CentOS6.5下卸载MySql(yum安装)

    因为我是用yum安装的mysql,所以卸载相对简单 yum -y remove mysql* 再把相关的文件删掉, rm -f /etc/my.cnf.rpmsave  rm -rf /var/lib ...