判断前缀,和hdu1671思路一样。
#include <stdio.h>
#include <algorithm>
#include <stdlib.h>
#include <string.h>
#include <iostream>
using namespace std;
typedef long long LL;
const int N = 15;
const int INF = 1e8;
struct Trie
{
int sum;
bool exist;
Trie *next[2];
Trie()
{
exist = 0;
sum = 0;
for(int i = 0; i < 2; i ++)
next[i] = 0;
}
}*root;
bool inserttrie(Trie *p, char *str)
{
int k = 0;
while(str[k] != '\0')
{
int id = str[k] - '0';
if(p -> next[id] == 0) p -> next[id] = new Trie;
p = p -> next[id];
if(p -> exist) return 0;
p -> sum ++;
k ++;
}
p -> exist = 1;
if(p -> sum > 1) return 0;
return 1;
}
void Free(Trie *p)
{
for(int i = 0; i < 2; i ++)
if(p -> next[i]) Free(p -> next[i]);
if(p) delete p;
}
int main()
{
// freopen("in.txt", "r", stdin);
char s[N];
int flag = 1, Case = 1;
root = new Trie;
while(~scanf("%s", s))
{
if(s[0] == '9')
{
if(flag) printf("Set %d is immediately decodable\n", Case ++);
else printf("Set %d is not immediately decodable\n", Case ++);
flag = 1;
Free(root);
root = new Trie;
continue;
}
if(!inserttrie(root, s)) flag = 0;
}
return 0;
}