题意:判断之前的字符串是否是当前的前缀字符串
题目链接: http://poj.org/problem?id=1056
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
bool flag;
struct Trie
{
int ch[10000][3];
int val[10000];
int sz;
void init()
{
sz = 1;
memset(ch[0], 0, sizeof(ch[0]) );
}
int id(char ch)
{
return ch - '0';
}
void Insert(const char *s)
{
int u = 0, len = strlen(s);
for(int i=0; i<len; i++)
{
int c = id(s[i]);
if(!ch[u][c])
{
memset(ch[sz], 0, sizeof(ch[sz]));
val[sz] = 0;
ch[u][c] = sz++;
}
else
{
if(val[ch[u][c]] == 1)
{
flag = false;
return ;
}
}
u = ch[u][c];
}
val[u] = 1;//标记字符串最后一个字符
}
};
char s[20];
Trie trie;
int main()
{
int cas = 1;
while(~scanf("%s", s))
{
flag = true;
trie.init();
trie.Insert(s);
while(scanf("%s", s))
{
if(strcmp(s, "9") == 0)
break;
if(flag)
trie.Insert(s);
}
if(flag)
printf("Set %d is immediately decodable\n",cas++);
else printf("Set %d is not immediately decodable\n",cas++);
}
return 0;
}