您的位置:首页 > 其它

hdu 1671 Phone List Trie树

2016-04-23 00:32 513 查看
题意:给定一个字符串的集合,看是否存在一个字符串是另一个字符串的前缀

思路:直接上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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息