题目描述
POJ 1056 IMMEDIATE DECODABILITY
解题思路
参考代码
//**********************************************
// Author: @xmzyt1996
// Date: 2015-10-16
// Name: POJ 1056.cpp
//**********************************************
#include <cstdio>
#include <cmath>
#include <cctype>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <string>
#include <bitset>
#include <vector>
#include <stack>
#include <queue>
#include <map>
#define clr(a, b) memset(a, b, sizeof(a))
using namespace std;
const int MAX_N = 100010;
struct Trie {
int next[2], flag;
}node[MAX_N<<2];
int num;
int getid (char c) {return c - '0'; }
void init() {
num = 0;
clr(node, 0);
}
void insert(char* s) {
Trie* head = &node[0];
while (*s) {
int id = getid(*s++);
if ((head->next[id]) == NULL)
head->next[id] = &node[++num];
head = head->next[id];
}
(head->flag) = 1;
}
bool search(char* s) {
Trie* head = &node[0];
while (*s) {
int id = getid(*s++);
if ((head->flag) == 1) return true;
head = head->next[id];
}
return false;
}
char s[MAX_N][15], str[15];
int main() {
int kase = 1;
while (~scanf("%s", str)) {
init();
int k = 0;
strcpy(s[k], str);
insert(s[k++]);
while (~scanf("%s", s[k]) && strcmp(s[k], "9"))
insert(s[k++]);
bool ok = false;
for (int i = 0; i < k; ++i) {
if (search(s[i])) {
ok = true;
break;
}
}
printf("Set %d is%simmediately decodable\n", kase++, ok ? " not " : " ");
}
return 0;
}