日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

二十一、前缀码判定

發(fā)布時間:2025/3/21 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 二十一、前缀码判定 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

二十一、前綴碼判定

文章目錄

  • 二十一、前綴碼判定
    • 題目描述
    • 解題思路
    • 上機代碼

題目描述

前綴碼:任何一個字符的編碼都不是同一字符集中另一個字符的編碼的前綴。

請編寫一個程序,判斷輸入的n個由1和0組成的編碼是否為前綴碼。如果這n個編碼是前綴碼,則輸出"YES”;否則輸出第一個與前面編碼發(fā)生矛盾的編碼。

輸入:
第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

測試輸入期待的輸出時間限制內存限制額外進程
測試用例 15
00
01
10
110
111
YES1秒64M0
測試用例 25
00
01
10
110
11
111秒64M0
測試用例 35
00
01
10
11
111
1111秒64M0
測試用例 45
111
110
10
01
00
YES1秒64M0
測試用例 58
00
010
0110
0111
10
110
1110
1111
YES1秒64M0
測試用例 68
00
010
0110
0111
10
11
1110
111
11101秒64M0

解題思路

所謂前綴碼的判定,本質上是二叉樹的建樹問題。令二叉樹的左子樹都代表1,遇到 1 都向左走;右子樹都代表0,遇到 0 都向右走。

對于全新的沒有前綴的字符編碼,則二叉樹中建立對應分支,分支除了最后一個結點外的所有結點值都為0,僅最后一個結點值為1。

字符編碼是前綴碼的話,如果在分支的行進過程中碰到值為 1 的結點,則當前字符編碼存在前綴碼;如果編碼遍歷完成,但是最后一個字符沒有新建結點,則當前字符編碼是別人的前綴碼。

對于前綴碼,我們用一個 flag 進行標記。當 flag 為 1 時表示存在前綴碼,輸出第一個前綴碼 prefix。如果全部判斷完成,flag 仍為0,則沒有前綴碼。

上機代碼

#include<cstdio> #include<cstring> #include<cstdlib> #include<iostream> #include<queue> #include<algorithm> using namespace std; typedef struct NODE {int data;struct NODE *lchild;struct NODE *rchild; }node,*Tree;int main() {int n = 0;char str[100010], prefix[100010];int flag = 0;Tree bit, T;bit = (Tree)malloc(sizeof(node));//初始化bit->data = 0;bit->lchild = NULL;bit->rchild = NULL;cin >> n;while(n--){memset(str, 0, sizeof(str));cin >> str;int len = strlen(str);if (flag == 1) //存在前綴碼后面都不用判斷了,讀取編碼后直接跳出循環(huán)continue;strcpy(prefix, str);//保存第一個前綴碼T = bit;//每次變回根節(jié)點初始化狀態(tài)for (int i = 0; i < len; i++){if (str[i] == '1') //1向左走{if (T->lchild == NULL)//左子樹新建結點{T->lchild = (Tree)malloc(sizeof(node));T = T->lchild;T->lchild = NULL;T->rchild = NULL;if (i == len - 1)T->data = 1;elseT->data = 0;}else{if (T->lchild->data == 1 || i == len - 1)//存在前綴碼{flag = 1;break;}elseT = T->lchild;}}else //0向右走{if (T->rchild == NULL)//右子樹新建結點{T->rchild = (Tree)malloc(sizeof(node));T = T->rchild;T->lchild = NULL;T->rchild = NULL;if (i == len - 1)T->data = 1;elseT->data = 0;}else{if (T->rchild->data == 1 || i == len - 1){flag = 1;break;}elseT = T->rchild;}}}}if (flag == 0)//沒有前綴碼cout << "YES" << endl;elsecout << prefix << endl;//system("pause");return 0; }

總結

以上是生活随笔為你收集整理的二十一、前缀码判定的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。