某个字符串不能是其他字符串的前缀,例如,”911“,“91125426”,911就是91125426的前缀,所以输出 NO。
代码一:
#include <iostream>
#include <algorithm>
#include <cmath>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
const int MAXN = 1e5+10;
int trie[MAXN][15],col[MAXN];
char num[MAXN];
int k,cnt,flag;
void Insert(char *num)
{
int len = strlen(num);
int pos = 0;
for(int i=0; i<len; i++)
{
k = num[i] - '0';
if(!trie[pos][k])
trie[pos][k] = ++cnt;
pos = trie[pos][k];
if(col[pos])
{
flag=1;
}
}
col[pos] = 1;
for(int i=0; i<=9; i++)
{
if(trie[pos][i])
{
flag=1;
}
}
}
int main()
{
int t,n;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
flag=0;
cnt = 0;
memset(col,0,sizeof(col));
memset(trie,0,sizeof(trie));
for(int i=1; i<=n; i++)
{
scanf("%s",num);
Insert(num);
}
if(flag)
{
cout<<"NO"<<endl;
}
else
{
cout<<"YES"<<endl;
}
}
return 0;
}
代码二:
#include <iostream>
#include <algorithm>
#include <cmath>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
const int MAXN = 1e5+10;
char s[15];
int flag,cnt;
struct node
{
int num[15];
int f;
void init()
{
memset(num,0,sizeof(num));
f=0;
}
}trie[MAXN];
void Insert(char *s)
{
int pos = 0;
int len = strlen(s);
for(int i=0; i<len; i++)
{
int k = s[i] - '0';
if(!trie[pos].num[k])
{
trie[pos].num[k] = ++cnt;
trie[cnt].init();
}
pos = trie[pos].num[k];
if(trie[pos].f)
{
flag=1;
}
}
for(int i=0; i<=9; i++)
{
if(trie[pos].num[i])
{
flag=1;
}
}
trie[pos].f=1;
}
int main()
{
int t,n;
scanf("%d",&t);
while(t--)
{
cnt = 0;
flag=0;
scanf("%d",&n);
trie[0].init();
for(int i=1; i<=n; i++)
{
scanf("%s",s);
Insert(s);
}
if(flag)
{
cout<<"NO"<<endl;
}
else
{
cout<<"YES"<<endl;
}
}
return 0;
}
我一开始写的代码有点啰嗦,不够利索,参考了其他人的代码进行改进,
下面是我一开始写的代码。
#include <iostream>
#include <algorithm>
#include <cmath>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
const int MAXN = 1e5+150;
int trie[MAXN][15],col[MAXN];
char num[MAXN][20];
int k,cnt;
void Insert(char *num)
{
int len = strlen(num);
int pos = 0;
for(int i=0; i<len; i++)
{
k = num[i] - '0';
if(!trie[pos][k])
trie[pos][k] = ++cnt;
pos = trie[pos][k];
}
col[pos] = 1;
}
int Find(char *num)
{
int pos = 0;
int len = strlen(num);
for(int i=0; i<len; i++)
{
if(col[pos]==1)
{
for(int j=0; j<=9; j++)
{
if(trie[pos][j])
{
return true;
}
}
}
k = num[i] - '0';
pos = trie[pos][k];
}
return false;
}
int main()
{
int t,n;
cin>>t;
while(t--)
{
cin>>n;
int flag=0;
cnt = 0;
memset(col,0,sizeof(col));
memset(trie,0,sizeof(trie));
for(int i=1; i<=n; i++)
{
cin>>num[i];
Insert(num[i]);
}
for(int i=1; i<=n; i++)
{
if(Find(num[i]))
{
flag=1;
break;
}
}
if(flag)
{
cout<<"NO"<<endl;
}
else
{
cout<<"YES"<<endl;
}
}
return 0;
}