哈夫曼树+搜索

抄了抄代码

先开始不知道怎么限制哈夫曼树,然后看了看代码,是用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. 使用jQuery的toggle()方法对HTML标签进行显示、隐藏操作

    这是一个示例: <html> <head> <script type="text/javascript" src="https://code ...

  2. THREE.js代码备份——webgl - scene animation(通过加载json文件来加载动画和模型)

    <!DOCTYPE html> <html lang="en"> <head> <title>three.js webgl - sc ...

  3. Mock随机生成数据模拟后台接口

    <html> <head> <title>测试</title> <script src="http://code.jquery.com/ ...

  4. js的一些老司机写法

    //取整 parseInt(a,10); //Before Math.floor(a); //Before a>>0; //Before ~~a; //After a|0; //After ...

  5. Linux命令(文本编辑器)

    vi和vim编辑器:有插入模式,一般模式,地行模式 一班模式通过(i.a.o.I.A.O)键--->进入插入模式            插入模式(按Esc键退出)---->j进入一班模式 ...

  6. idea中配置xml不自动提示解决方案

    1.打开设置File-->Settings(或者Ctrl + Alt + S)--->Languages&Frameworks-->Schemas and DTDS 2.选择 ...

  7. [SQL Service]从一张表取值更新另一张表字段

    1. update table_A set  table_A_column = ab.column from table_A aa left join table_B ab on aa.xx = ab ...

  8. Keil-MDK编译完成后代码大小

    Code 代表执行的代码,程序中所有的函数都位于此处. RO-data 代表只读数据,程序中所定义的全局常量数据和字符串都位于此处. RW-data 代表已初始化的读写数据,程序中定义并且初始化的全局 ...

  9. 【Codeforces 1B】Spreadsheets

    [链接] 我是链接,点我呀:) [题意] A~Z分别对应了1~26 AA是27依次类推 让你完成双向的转换 [题解] 转换方法说实话特别恶心>_< int转string 得像数位DP一样一 ...

  10. hdu 4081 最小生成树变形

    /*关于最小生成树的等效边,就是讲两个相同的集合连接在一起 先建立一个任意最小生成树,这条边分开的两个子树的节点最大的一个和为A,sum为最小生成树的权值和,B为sum-当前边的权值 不断枚举最小生成 ...