一、用的二维数组
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 100;
int tr[maxn][2];
int mk[maxn];
int tot;
void insert(string s)
{
int u =0;
for(int i=0;i<s.length();i++)
{
int x = s[i]-'0';
if(tr[u][x]==0)
tr[u][x]=++tot;
u=tr[u][x];
}
mk[u]++;
}
bool find(string s)
{
int u=0;
for(int i=0;i<s.length();i++)
{
int x = s[i] - '0';
if(tr[u][x])
{
if(mk[u])
return false;
else
u=tr[u][x];
}
}
if(mk[u]>=2)
return false;
return true;
}
int main ()
{
string s[maxn];
int num=0;
int t=0;
tot=0;
memset(tr,0,sizeof(tr));
memset(mk,0,sizeof(mk));
while(cin >> s[num])
{
if(s[num]=="9")
{
int i=0;
int flag = 1;
for(;i<num;i++)
{
if(!find(s[i]))
{
printf("Set %d is not immediately decodable\n",++t);
flag=0;
break;
}
}
if(flag)
printf("Set %d is immediately decodable\n",++t);
tot=0;
num=0;
memset(tr,0,sizeof(tr));
memset(mk,0,sizeof(mk));
}
else
{
insert(s[num++]);
}
}
return 0;
}
二、用的结构体数组
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int num,tot;
const int maxn = 100;
typedef struct
{
int cnt;
int next[2];
}N;
N T[maxn];
void insert(string s)
{
int u = 0;
for(int i=0;i<s.length();i++)
{
int x = s[i]-'0';
if(T[u].next[x]==0)
T[u].next[x]=++tot;
u=T[u].next[x];
}
T[u].cnt++;
}
bool find(string s)
{
int u = 0;
for(int i=0;i<s.length();i++)
{
int x = s[i] - '0';
if(T[u].next[x])
{
if(T[u].cnt)
return false;
else
u=T[u].next[x];
}
}
if(T[u].cnt>=2)
return false;
return true;
}
int main ()
{
string s[maxn];
num=0;
tot=0;
int t=1;
memset(T,0,sizeof(T));
while(cin >> s[num])
{
if(s[num]!="9")
{
insert(s[num]);
num++;
}
else
{
int i;
int flag = 1;
for(i=0;i<num;i++)
{
int k = find(s[i]);
if(!k)
{
flag=0;
printf("Set %d is not immediately decodable\n",t++);
break;
}
}
if(flag)
printf("Set %d is immediately decodable\n",t++);
num=0;
tot=0;
memset(T,0,sizeof(T));
}
}
return 0;
}
三、链表,指针
#include <iostream>
#include <cstring>
#include <algorithm>
#include <string>
using namespace std;
const int maxn = 100;
typedef struct node
{
int cnt;
node *next[2];
node()
{
cnt = 0;
next[0] = NULL;
next[1] = NULL;
}
}N;
N *root;
void insert(string s)
{
N *p = root;
for(int i=0;i<s.length();i++)
{
int x = s[i]-'0';
if(p->next[x]==NULL)
p->next[x]=new N;
p=p->next[x];
}
p->cnt++;
}
bool find(string s)
{
N *p = root;
for(int i=0;i<s.length();i++)
{
int x = s[i]-'0';
if(p->next[x]!=NULL)
{
if(p->cnt)
{
return false;
}
else
p=p->next[x];
}
}
if(p->cnt>=2)
return false;
return true;
}
void del_node(N *root)
{
for(int i=0;i<2;i++)
{
if(root->next[i]!=NULL)
del_node(root->next[i]);
}
delete(root);
}
int main ()
{
string s[maxn];
int num = 0;
int t = 1;
root = new N;
while(cin >> s[num])
{
if(s[num] == "9")
{
int flag = 1;
int i;
for(i=0;i<num;i++)
{
if(!find(s[i]))
{
flag = 0;
printf("Set %d is not immediately decodable\n",t++);
break;
}
}
if(flag)
printf("Set %d is immediately decodable\n",t++);
num = 0;
del_node(root);
root = new N;
}
else
{
insert(s[num++]);
}
}
return 0;
}