题意:给定一个字符串的集合,看是否存在一个字符串是另一个字符串的前缀
思路:直接上lrj的模板, 话说深感此模板强大,比动态分配简洁许多,就是耗内存多,细节看代码
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1671
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int n;
char s[20];
bool flag;
struct Trie
{
int ch[100000][15];
int val[100000];
int sz;
int id(char c)
{
return c - '0';
}
void init()
{
sz = 1;
memset(ch[0], 0, sizeof(ch[0]));
memset(val, 0,sizeof(val));
}
void Insert(const char *s)
{
int u = 0, len = strlen(s);
for(int i=0; i<len; i++)
{
int c = id(s[i]);
if(!ch[u][c])
{
memset(ch[sz], 0, sizeof(ch[sz]));
ch[u][c] = sz++;
val[u] = 0;
}
else
{
if(val[ch[u][c]] == 1) //之前的字符串是当前字符串的前缀
{
flag = false;
return ;
}
}
u = ch[u][c];
}
val[u] = 1;
for(int i=0; i<10; i++) //当前字符串是之前的字符串的前缀
if(ch[u][i]) flag = false;
}
};
Trie trie;
int main()
{
int t;
scanf("%d", &t);
while(t--)
{
scanf("%d", &n);
trie.init();
flag = true;
for(int i=0; i<n; i++)
{
scanf("%s", s);
if(flag)
trie.Insert(s);
}
if(flag)
puts("YES");
else
puts("NO");
}
return 0;
}