字典树统计字符串个数
题意:给你一些字母的编码,全部为01串,让你判断一个01串是不是另外一个01串的前缀。
思路:把01全部存入字典树里面,在依次查找这些字符串,如果这个字符串出现的次数大于等于两次,就不可以快速解码了
详情见代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define maxn 100010
int cur=1;
char str[maxn][12];
int vis[maxn];
struct node
{
int num;
int next[4];
void init()
{
num=0;
memset(next,-1,sizeof(next));
}
} trie[maxn];
void insert(char *s,int len)
{
int p=0;
for(int i=0; i<len; i++)
{
int x=s[i]-'0';
if(trie[p].next[x]==-1)
{
trie[cur].init();
trie[p].next[x]=cur++;
}
p=trie[p].next[x];
trie[p].num++;
}
}
bool find(char *s,int len)
{
int p=0;
for(int i=0; i<len; i++)
{
int x=s[i]-'0';
p=trie[p].next[x];
}
if(trie[p].num>=2)return false;//01串是另外一个01串的前缀
else return true;
}
int main()
{
int ans=0;
char ss[12];
cur=1;
trie[0].init();
int n=0,len;
while(~scanf("%ss",ss))
{
// cur=1;
if(strcmp(ss,"9")==0)break;
strcpy(str[n],ss);
len=strlen(str[n]);
str[n][len]='\0';
vis[n]=len;
insert(str[n],len);
n++;
for(;;)
{
scanf("%s",str[n]);
if(strcmp(str[n],"9")==0)break;
len=strlen(str[n]);
vis[n]=len;
insert(str[n],len);
n++;
}
bool flag;
for(int i=0; i<n; i++)
{
flag=find(str[i],vis[i]);
if(!flag)break;
}
if(flag)printf("Set %d is immediately decodable\n",++ans);
else printf("Set %d is not immediately decodable\n",++ans);
cur=1;
trie[0].init();
n=0;
}
return 0;
}