• 1. 前缀码判定


    前缀码:任何一个字符的编码都不是同一字符集中另一个字符的编码的前缀。

    请编写一个程序,判断输入的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. 5↵
    2. 00↵
    3. 01↵
    4. 10↵
    5. 110↵
    6. 111↵
    以文本方式显示
    1. YES↵
    1秒64M0
    测试用例 2以文本方式显示
    1. 5↵
    2. 00↵
    3. 01↵
    4. 10↵
    5. 110↵
    6. 11↵
    以文本方式显示
    1. 11↵
    1秒64M0
    测试用例 3以文本方式显示
    1. 5↵
    2. 00↵
    3. 01↵
    4. 10↵
    5. 11↵
    6. 111↵
    以文本方式显示
    1. 111↵
    1秒64M0
    测试用例 4以文本方式显示
    1. 5↵
    2. 111↵
    3. 110↵
    4. 10↵
    5. 01↵
    6. 00↵
    以文本方式显示
    1. YES↵
    1秒64M0
    测试用例 5以文本方式显示
    1. 8↵
    2. 00↵
    3. 010↵
    4. 0110↵
    5. 0111↵
    6. 10↵
    7. 110↵
    8. 1110↵
    9. 1111↵
    以文本方式显示
    1. YES↵
    1秒64M0
    测试用例 6以文本方式显示
    1. 8↵
    2. 00↵
    3. 010↵
    4. 0110↵
    5. 0111↵
    6. 10↵
    7. 11↵
    8. 1110↵
    9. 111↵
    以文本方式显示
    1. 1110↵
    1秒64M0

    代码如下:

            比较简单注释就只写了下思路,其实就是哈夫曼树,以后应该要学。也有可能是我上课睡觉听漏了,说不定已经教了。

            需要注意为假的判定。

            也可以用数组写。

    1. /*
    2. Huffman Tree(哈夫曼树),树干即编码,路径长度即编码长度.
    3. 根据二叉树特性通过树干路径进行编码(左分支赋予0,右分支赋予1).
    4. 构成前缀编码的形式,即一组编码中任一编码都不是其他任何一个编码的前缀.
    5. 那么这道题也就是考虑根据编码能否还原出一个哈夫曼树的问题,
    6. 如果能还原出一个哈夫曼树,那么就是一组编码中任一编码都不是其他任何一个编码的前缀
    7. */
    8. #include
    9. #include
    10. using namespace std;
    11. struct HFTree
    12. {
    13. bool flag;
    14. HFTree *left;
    15. HFTree *right;
    16. HFTree() : flag(false), left(nullptr), right(nullptr) {}
    17. };
    18. bool isPrefixCode(const string &str, HFTree *&root)
    19. {
    20. HFTree *Root = root;
    21. for (char ch : str)
    22. {
    23. if (ch == '0')
    24. {
    25. if (Root->left == nullptr)
    26. Root->left = new HFTree;
    27. Root = Root->left;
    28. if (Root->flag)
    29. return false;
    30. }
    31. else
    32. {
    33. if (Root->right == nullptr)
    34. Root->right = new HFTree;
    35. Root = Root->right;
    36. if (Root->flag)
    37. return false;
    38. }
    39. }
    40. Root->flag = true;
    41. return !Root->left && !Root->right;
    42. }
    43. int main()
    44. {
    45. int n;
    46. cin >> n;
    47. HFTree *root= new HFTree;
    48. while (n--)
    49. {
    50. string str;
    51. cin >> str;
    52. if (!isPrefixCode(str, root))
    53. {
    54. cout << str << endl;
    55. return 0;
    56. }
    57. }
    58. cout << "YES" << endl;
    59. return 0;
    60. }

  • 相关阅读:
    React报错之Cannot find name
    J9数字论:关于DAO 特点的宏观分析
    区块链智能合约开发
    QT作业三
    IOS面试题object-c 1-10
    linux shell脚本读取并解析yaml文件
    Educational Codeforces Round 138 (Rated for Div. 2) D
    C语言回调函数到底是怎么回事?
    企业在知乎上做问答推广的技巧分析,企业知乎推广营销方法步骤
    sql注入绕过waf
  • 原文地址:https://blog.csdn.net/Cosmo9/article/details/134019053