题目
前缀码:任何一个字符的编码都不是同一字符集中另一个字符的编码的前缀。
请编写一个程序,判断输入的n个由1和0组成的编码是否为前缀码。如果这n个编码是前缀码,则输出"YES”;否则输出第一个与前面编码发生矛盾的编码。
输入:
第1行为n(表示下面有n行编码)
第2~n+1行为n个由0或1组成的编码
输出:判断结果
例如,如果输入:
5
00
01
10
110
111
每一个字符均不是其他字符编码的前缀,所以,输出:YES
再如,如果输入:
5
00
01
10
110
11
编码11与前面的编码110的前缀,所以,输出:11
测试输入 | 期待的输出 | 时间限制 | 内存限制 | 额外进程 | |
---|---|---|---|---|---|
测试用例 1 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
测试用例 2 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
测试用例 3 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
测试用例 4 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
测试用例 5 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
测试用例 6 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
C++代码
#include <iostream>
#include <vector> using namespace std; // 定义二叉树的节点,包含一个布尔型成员变量 is_end 和一个 TreeNode 指针数组 next
struct TreeNode { bool is_end; // 布尔型变量,表示当前节点是否是一个字符串的结束 TreeNode* next[2]; // TreeNode 指针数组,表示下一个节点 TreeNode() : is_end(false) { // 构造函数,初始化变量 next[0] = nullptr; // 下一个节点的第一部分设为空 next[1] = nullptr; // 下一个节点的第二部分设为空 }
}; // 插入函数:在二叉树中插入一个字符串
bool insert(TreeNode* root, string& code) { TreeNode* node = root; for (int i = 0; i < code.size(); ++i) { int index = code[i] - '0'; // 计算字符对应的索引 if (!node->next[index]) { // 判断子节点是否为空 node->next[index] = new TreeNode(); } node = node->next[index]; // 移动到下一个子节点 if (node->is_end) { // 如果此节点是字符串的结束,则插入失败 return false; } } node->is_end = true; // 标记插入的字符串结束的位置 return !node->next[0] && !node->next[1]; // 插入成功条件是当前节点无子节点
} // 主函数
int main() { int n; cin >> n; // 输入字符串的数量 TreeNode* root = new TreeNode(); // 创建新的二叉树 for (int i = 0; i < n; ++i) { string code; cin >> code; // 读取待插入的字符串 if (!insert(root, code)) { // 如果插入失败(返回 false) cout << code << endl; // 输出字符串 delete root; // 释放内存 return 0; // 程序错误退出 } } cout << "YES" << endl; // 所有字符串都插入成功,输出:YES delete root; // 释放内存 return 0; // 程序正常退出
}
跳至...