IMMEDIATE DECODABILITY POJ - 1056 (字典树)

本文探讨了立即可解码符号集的概念,即任一符号的编码不是其他符号编码的前缀。通过使用Trie树的数据结构,文章提供了一种高效的方法来检查一组二进制编码是否满足这一条件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


An encoding of a set of symbols is said to be immediately decodable if no code for one symbol is the prefix of a code for another symbol. We will assume for this problem that all codes are in binary, that no two codes within a set of codes are the same, that each code has at least one bit and no more than ten bits, and that each set has at least two codes and no more than eight. 

Examples: Assume an alphabet that has symbols {A, B, C, D} 

The following code is immediately decodable: 
A:01 B:10 C:0010 D:0000 

but this one is not: 
A:01 B:10 C:010 D:0000 (Note that A is a prefix of C) 
Input
Write a program that accepts as input a series of groups of records from standard input. Each record in a group contains a collection of zeroes and ones representing a binary code for a different symbol. Each group is followed by a single separator record containing a single 9; the separator records are not part of the group. Each group is independent of other groups; the codes in one group are not related to codes in any other group (that is, each group is to be processed independently).
Output
For each group, your program should determine whether the codes in that group are immediately decodable, and should print a single output line giving the group number and stating whether the group is, or is not, immediately decodable.
Sample Input
01
10
0010
0000
9
01
10
010
0000
9
Sample Output
Set 1 is immediately decodable
Set 2 is not immediately decodable
 



题意: 给你一个由很多01字符串组成的集合,问你集合中有没有一个字符串是其他另外一个或多个字符串的前缀.


思路: 给节点增加个ending 标记, 记录每一个串得端点。 边插入边判断就好了


#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
using namespace std;
const int N = 1e5;
struct Trie{
	bool ending;
	int child[10];
	Trie(){
		ending = 0;
		memset(child,0,sizeof(child));
	}
}trie[N];
int trieN;

void init(){
	memset(trie[0].child,0,sizeof(trie[0].child));
	trieN = 0;
}

bool Insert(const string& str){
	bool flag = 1;
	int cur = 0;
	for(int i = 0;str[i];i++){
		int d = str[i] - '0';
		if (trie[cur].child[d] == 0){
			trie[++trieN] = Trie();
			trie[cur].child[d] = trieN;
			flag = 0;
		}
		cur = trie[cur].child[d];
		if (trie[cur].ending) return true;
	}
	trie[cur].ending = 1;
	if (flag) return true;
	return false;
}

int main(){
	ios::sync_with_stdio(false);
	int t = 0;
	init();
	bool flag = 0;
	string str;
	while(cin >> str) {
		if (str[0] != '9') {
    		bool ret = Insert(str);
    		if (flag == 0) flag = ret;
    	} else {
    	    if (flag) cout << "Set " << ++t << " is not immediately decodable\n";
    	    else cout << "Set " << ++t << " is immediately decodable\n";
    	    
    	    init();flag = 0;
    	}
	}
	return 0;
}




### ORA-01034 错误分析与解决方案 ORA-01034 是 Oracle 数据库中的常见错误之一,表示数据库实例不可用。以下是该问题的具体原因以及修复方法。 #### 一、错误原因 ORA-01034 的主要原因是 Oracle 实例未启动或未能正常运行。具体可能由以下几个方面引起: 1. **Oracle 服务未启动** 如果 Oracle 数据库服务未被正确初始化,则会触发此错误[^2]。 2. **环境变量配置不正确** 当 `ORACLE_HOME` 或 `TNS_ADMIN` 环境变量设置有误时,可能导致 SQL*Plus 无法找到正确的数据库路径[^1]。 3. **监听器状态异常** 即使数据库已启动,如果监听器未正确注册到数据库实例上,也可能引发此类错误。 4. **硬件资源不足** 若服务器内存或其他系统资源耗尽,可能会阻止 Oracle 正常启动并抛出 ORA-01034 错误[^3]。 --- #### 二、解决步骤 ##### 1. 验证 Oracle 服务的状态 检查目标主机上的 Oracle 服务是否正在运行。可以通过以下命令验证: ```bash ps -ef | grep ora_ ``` 如果没有发现任何进程,则说明 Oracle 服务尚未启动。此时可以尝试手动启动数据库实例: ```sql startup nomount; alter database mount; alter database open; ``` ##### 2. 检查监听器状态 确认监听器是否处于活动状态,并成功注册到了对应的数据库实例上。执行如下操作来查看监听器详情: ```bash lsnrctl status ``` 如果显示 “UNKNOWN INSTANCE”,则表明监听器未完成正常的注册过程。重新加载监听器配置文件后再次测试: ```bash lsnrctl reload ``` ##### 3. 审核环境变量设定 确保操作系统层面设置了恰当的环境参数,特别是 `ORACLE_SID`, `ORACLE_HOME` 和其他必要的变量。例如,在 Linux 平台下可编辑 `.bash_profile` 文件加入这些定义: ```bash export ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1 export PATH=$ORACLE_HOME/bin:$PATH export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib export TNS_ADMIN=$ORACLE_HOME/network/admin ``` 随后刷新 shell session 让更改生效: ```bash source ~/.bash_profile ``` ##### 4. 排除硬件瓶颈因素 利用工具监控 CPU 使用率、磁盘 I/O 性能指标等,判断是否存在物理层面上阻碍 Oracle 启动的情况。必要情况下增加更多 RAM 或优化存储子系统的布局结构以缓解压力。 --- #### 三、预防措施 为了避免未来发生类似的状况,建议采取以下策略: - 定期备份重要数据以防丢失; - 设置自动化的健康检测脚本定期扫描潜在风险点; - 对于生产环境中使用的机器保持良好的维护习惯,及时更新补丁版本; --- ### 示例代码片段 下面提供一段用于诊断和恢复的 PL/SQL 脚本作为参考: ```plsql BEGIN IF (dbms_utility.get_parameter_value(&#39;instance_status&#39;) != &#39;OPEN&#39;) THEN EXECUTE IMMEDIATE &#39;ALTER DATABASE OPEN&#39;; END IF; EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(SQLERRM); END; / ``` 上述代码逻辑简单明了:先查询当前实例状态,如果不是开放模式就强制打开它。同时捕获可能出现的各种例外情况以便进一步处理。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值