和1671类似。
// File Name: hdu1305.cpp
// Author: Toy
// Created Time: 2013年05月08日 星期三 07时25分58秒
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <cctype>
#include <cmath>
#include <string>
#include <algorithm>
#include <cstdlib>
#include <iomanip>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <stack>
#include <utility>
#include <bitset>
#define L(x) x << 1
#define R(x) x << 1 | 1
using namespace std;
const int sigma_size = 2;
const int maxnode = 8 * 10 + 10;
string st[100];
int cnt, tmp;
bool flag[15];
struct Trie {
int ch[maxnode][sigma_size];
int val[maxnode];
int sz;
void clear ( ) { sz = 1; memset ( ch[0], 0, sizeof ( ch[0] ) ); }
int idx ( char c ) { return c - '0'; }
void insert ( string s, int v ) {
int u = 0, n = s.length ();
for ( int i = 0; i < n; ++i ) {
int c = idx ( s[i] );
if ( !ch[u][c] ) {
memset ( ch[sz], 0, sizeof ( ch[sz] ) );
val[sz] = 0;
ch[u][c] = sz++;
}
u = ch[u][c];
}
val[u] = v;
}
bool find ( string s, int cnt ) {
int u = 0, n = s.length();
for ( int i = 0; i < n; ++i ) {
if ( s[i] == '\0' ) break;
int c = idx ( s[i] );
if ( !ch[u][c] ) break;
u = ch[u][c];
if ( val[u] == 1 && i != n - 1 ) flag[cnt]++;
}
}
}trie;
int main ( ) {
tmp = cnt = 1;
trie.clear();
memset ( flag, 0, sizeof ( flag ) );
while ( cin >> st[tmp] ) {
if ( st[tmp] != "9" ) trie.insert ( st[tmp], 1 );
else {
for ( int i = 1; i <= tmp; ++i )
trie.find ( st[i], i );
bool cmp = 0;
for ( int i = 1; i <= tmp; ++i )
if ( flag[i] ) cmp = 1;
if ( cmp ) cout << "Set " << cnt++ << " is not immediately decodable" << endl;
else cout << "Set " << cnt++ << " is immediately decodable" << endl;
trie.clear();
tmp = 0;
memset ( flag, 0, sizeof ( flag ) );
}
tmp++;
}
return 0;
}