B - ZJM 与生日礼物(选做)
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
题目分析
- 采用字典树的方式来解决字符串匹配问题
- 再插入过程中判断是否可以匹配
(1)最后一个字符落到已存在的节点
(2)经过其他字符串的尾部
完整代码
#include<iostream>
#include<string.h>
using namespace std;
struct Trie {
static const int N = 1e5 + 10, charset = 2;
int tot, root, child[N][charset], flag[N];
Trie() {
memset(child, -1, sizeof(child));
root = tot = 0;
}
bool insert(char *str) {
int now = root, lenth = strlen(str);
for (int i = 0; i < lenth; i++)
{
int x = str[i] - '0';
if (child[now][x] == -1) {
child[now][x] = ++tot;
flag[now] = 0;
}
else if (flag[child[now][x]] || i == lenth - 1)
return true;
now = child[now][x];
}
flag[now] = 1;
return false;
}
void clear() {
memset(child, -1, sizeof(child));
root = tot = 0;
}
};
Trie tree;
char str[100];
int main()
{
int k = 1;
while (cin>>str)
{
if (str[0] == '9')
{
cout << "Set " << k++ << " is immediately decodable" << endl;
tree.clear();
continue;
}
if (tree.insert(str)) {
while (str[0]!='9')
cin >> str;
cout << "Set " << k++ << " is not immediately decodable" << endl;
}
}
return 0;
}