| Time Limit: 1000MS | Memory Limit: 10000K | |
| Total Submissions: 13014 | Accepted: 6235 |
Description
Examples: Assume an alphabet that has symbols {A, B, C, D}
The following code is immediately decodable:
A:01 B:10 C:0010 D:0000
but this one is not:
A:01 B:10 C:010 D:0000 (Note that A is a prefix of C)
Input
Output
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
【题意】要求所给字符串是否有的是其他字符串的前缀。
【解题方法】可以想到字典树,字典树的一个分支记录一个字符串,叶子节点做相应的标记。如果在字典树上插入新字符串的时候经过先前的叶子节点标记,则说明以该节点为叶子节点的路径上的字符串是当前插入字符串的前缀;如果在字典树上插入新字符串的长度小于当前所在的分支,则说明当前插入字符串是经过当前路径的所有分支所标示的字符串的前缀。
【AC 代码】
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 100010;
char s[20];
bool ff;
struct Trie{
int root,sz,nxt[maxn][2],flag[maxn];
int newnode()
{
flag[sz]=0;
nxt[sz][0]=nxt[sz][1]=-1;
return sz++;
}
void init()
{
sz=0;
root=newnode();
}
void insert(char *s)
{
int u=root,n=strlen(s);
for(int i=0; i<n; i++){
int &v=nxt[u][s[i]-'0'];
if(v!=-1)
{
if(flag[v]||i==n-1)
{
ff=false;
return ;
}
}
else{
v=newnode();
}
u=v;
}
flag[u]=1;
}
}trie;
int main()
{
int cas=1;
while(scanf("%s",s)!=EOF)
{
ff=true;
trie.init();
trie.insert(s);
while(scanf("%s",s))
{
if(strcmp(s,"9")==0) break;
if(ff) trie.insert(s);
}
if(!ff) printf("Set %d is not immediately decodable\n",cas++);
else printf("Set %d is immediately decodable\n",cas++);
}
return 0;
}
384



被折叠的 条评论
为什么被折叠?



