暴力
#include<iostream>
#include<string.h>
#include<cstdio>
using namespace std;
int main()
{
int t=0,i=0;
char s[10][12];
bool a[12][12];
memset(s,' ',sizeof(s));
while(scanf("%s",s[i])!=EOF)
{
if(s[i][0]=='9')
{
t++;
int state=1;
memset(a,false,sizeof(a));
for(int j=0;j<i;j++)
for(int k=j+1;k<=i;k++)
for(int l=0;s[j][l]!=' '&&s[k][l]!=' ';l++)
{if(s[j][l]!=s[k][l])
{a[j][k]=true; //cout<<j<<k<<l<<endl;
}
//cout<<j<<k<<l<<endl;
//cout<<l<<s[k][l]<<endl;
}
for(int j=0;j<i;j++)
for(int k=j+1;k<=i;k++)
if(a[j][k]==false)
state=0;
if(!state)
printf("Set %d is not immediately decodable
",t);
if(state==1)
printf("Set %d is immediately decodable
",t);
memset(s,' ',sizeof(s));
i=0;
}
else
i++;
}
return 0;
}
字典树
#include<iostream>
#include<string.h>
#include<cstdio>
using namespace std;
int tree[5000][2];
int w[5000];
int numv=0;
char s[10][12];
void insert(char s[])
{
int u=0;
w[0]++;
int len=strlen(s);
for(int i=0; i<len; i++)
{
if(tree[u][s[i]-'0']==0)
{
tree[u][s[i]-'0']=++numv;
}
u=tree[u][s[i]-'0'];
w[u]++;
}
//cout<<w[1]<<w[2]<<endl;
}
bool find(char s[])
{
int u=0;
int len=strlen(s);
for(int i=0; i<len; i++)
{
u=tree[u][s[i]-'0'];
//cout<<w[u]<<" "<<u<<s[i]<<endl;
if(w[u]==1)
{
return true;
break;
}
}
return false;
}
int main()
{
int t=0,i=0;
bool a[12];
memset(s,' ',sizeof(s));
while(scanf("%s",s[i])!=EOF)
{
if(s[i][0]=='9')
{
numv=0;
memset(tree,0,sizeof(tree));
memset(w,0,sizeof(w));
memset(a,false,sizeof(a));
t++;
int state=1;
for(int j=0; j<i; j++)
insert(s[j]);
for(int j=0; j<i; j++)
if(find(s[j])==true)
{
a[j]=true;
}
for(int j=0; j<i; j++)
if(a[j]==false)
{state=0; //cout<<j<<"as"<<endl;
}
if(!state)
cout<<"Set "<<t<<" is not immediately decodable"<<endl;
else
cout<<"Set "<<t<<" is immediately decodable"<<endl;
memset(s,' ',sizeof(s));
i=0;
}
else
i++;
}
return 0;
}