字典树水题,题目大意就是找是否有字符串是其他字符串的前缀,有就NO,没有就YES。需要注意一下两点
1、
3
97625999
91125426
911
3
911
97625999
91125426
这两组数据的比较。
2、每次用完树需删除,否则会超内存!!!
直接附上AC代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string.h>
using namespace std;
#define num 10
struct trie
{
int flag;
trie *Next[num];
trie()
{
flag = 0;
int i ;
for(i = 0 ; i < num ; i ++ )
{
Next[i] = NULL;
}
}
}*current , *newnode;
void Delete(trie *p)
{
if(p==NULL)
return ;
int i;
for(i=0;i<10;i++)
{
Delete(p->Next[i]);
}
delete p;
}
int main()
{
int t ;
cin >> t ;
while(t -- )
{
trie *mytrie = new trie ;
int n;
cin >> n ;
getchar();
char temp[10];
int flag2 = 0 , flag3 = 0;
for(int j = 0 ; j < n ; j ++ )
{
gets(temp);
int len = strlen(temp);
current = mytrie;
if(!flag2 && !flag3)
{
for(int i = 0 ; i < len ; i ++ )
{
int m = temp[i] - '0' ;
if(current->Next[ m ] != NULL)
{
if(current->Next[ m ]->flag == 1 && !flag2)
{
flag2 = 1 ;
break;
}
current = current->Next[m];
if(i == len - 1)
{
current -> flag = 1;
flag3 = 1 ;
break;
}
}
else
{
newnode = new trie;
current -> Next[m] = newnode;
current = newnode;
if(i == len - 1) current -> flag = 1;
}
}
if(flag2 ||flag3) continue;
}
}
if(!flag2 && !flag3) cout << "YES" << endl;
else cout << "NO" << endl ;
Delete(mytrie);
}
return 0;
}