题意
ZJM 收到了 Q老师 送来的生日礼物,但是被 Q老师 加密了。只有 ZJM 能够回答对 Q老师 的问题,Q老师 才会把密码告诉 ZJM。
Q老师 给了 ZJM 一些仅有 01 组成的二进制编码串, 他问 ZJM:是否存在一个串是另一个串的前缀.
Input
多组数据。每组数据中包含多个仅有01组成的字符串,以一个9作为该组数据结束的标志。
Output
对于第 k 组数据(从1开始标号),如果不存在一个字符串使另一个的前缀,输出"Set k is immediately decodable",否则输出"Set k is not immediately decodable"。
每组数据的输出单独一行
输入样例
01
10
0010
0000
9
01
10
010
0000
9
输出样例
Set 1 is immediately decodable
Set 2 is not immediately decodable
提示
分析
这也是一道用字典树解决的字符串问题。
1. 什么是字典树?字典树的作用?
字典树就是指的每个节点存储的都是一个字符的树。从根到任意一个叶子经过的路径就代表着一个完整字符串。
字典树主要用于判断一个字符是否是另一个字符的前缀。
2. 字典树类型
字典树类型:
3. 字典树构造
每一次插入都从根节点开始,依次插入字符串中的每一个字符:
4. 字典树判断原理
根据前面的介绍我们已经知道,从根到任意叶子的路径都是一个完整的字符串。
但是可以想到,若字符串a包含字符串b,则字符串b无法从根走到任何一个叶子,而是属于a这条从根到叶子的路径中的一部分。
显然,判断两个字符串之间结尾节点的关系就是判断两个字符串包含关系的关键。
若仅存在两个字符串a和b,其中a已插入字典树中:
需要注意的是:
假设两个字符串a和b,长度分别为l1和l2(l1 >= l2)
若a和b前l3长度都完全相同,则显然它们插入在字典树的位置完全相同。
若第l3 + 1个字符不同,则a和b的第l3 + 1个字符将分别被插入在第l3个字符的不同孩子位置处。
就算剩下的所有字符都相同,a和b在第l3 + 1个之后的所有字符都将属于完全不同的路径。
这就是前面判断的基础。若一个节点已存在,则说明其一定属于于一个已存在的字符串中,只要该节点是一个结尾节点,不论其属于谁,都一定代表着存在包含关系。
这就是一道典型的字典树问题。需要注意的是这个题目中涉及到的字符类型只有2种,即0和1。因此孩子数组中第二维只需要设置为2,即代表对每个节点来说会有0和1两个类型的孩子。
总结
- 字符串还挺有意思😮
代码
#include <iostream>
#include <string.h>
#include <string>
using namespace std;
struct Tree
{
static const int N = 100000;
static const int charset = 2;
int tot;
int root;
int child[N][2];
bool flag[N];
Tree()
{
memset(child,-1,sizeof(child));
root = 0;
tot = 0;
}
void clear()
{
memset(child,-1,sizeof(child));
root = 0;
tot = 0;
}
bool insert(string s)
{
int now = root;
bool judge = false;
for( int i = 0 ; i < s.size() ; i++ )
{
int x = s[i] - '0';
if( child[now][x] == -1 )
{
child[now][x] = ++tot;
flag[now] = 0;
}
else if( i == s.size() - 1 || flag[child[now][x]] )
judge = true;
now = child[now][x];
}
flag[now] = 1;
return judge;
}
};
int main()
{
ios::sync_with_stdio(false);
int k = 0;
string s;
Tree t;
bool judge = false;
while( cin>>s )
{
if( s == "9" )
{
if( !judge )
cout<<"Set "<<++k<<" is immediately decodable"<<endl;
else
cout<<"Set "<<++k<<" is not immediately decodable"<<endl;
t.clear();
judge = false;
}
else
{
if( t.insert(s) )
judge = true;
}
}
return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)