您的位置:首页 > 其它

POJ 3630 Phone List

2017-03-29 22:07 211 查看
http://poj.org/problem?id=3630

题意:
给出一个电话号码列表,确定它是否一致,即没有数字是另一个的前缀。

思路:

边输入边建立字典树,通过字典树判断某个数是否是另一个的前缀很方便。

#include<iostream>
#include<algorithm>
#include<string>
#include<cstring>
using namespace std;

const int maxn = 100000 + 10;

char s[12];

struct Trie
{
int ch[maxn][10];
int val[maxn];
int sz;

void init()
{
sz = 1;
memset(ch[0], 0, sizeof(ch[0]));
}

bool insert(char *s)
{
int u = 0, len = strlen(s);
int mark = 0;
for (int i = 0; i < len; i++)
{
int c = s[i] - '0';
if (!ch[u][c])
{
mark = 1;
memset(ch[sz], 0, sizeof(ch[sz]));
val[sz] = 0;
ch[u][c] = sz++;
}
u = ch[u][c];
if (val[u] == 1)  return false;
}
val[u] = 1;
if (!mark)   return false;   //如果到字符最后没有开辟新的结点,说明前面已经出现过该串
return true;
}
}t;

int main()
{
//freopen("D:\\txt.txt", "r", stdin);
int T;
scanf("%d", &T);
while (T--)
{
int n;
scanf("%d", &n);
t.init();
bool flag = true;
while (n--)
{
scanf("%s", s);
if (flag && !t.insert(s))   flag = false;
}
if (flag)  printf("YES\n");
else  printf("NO\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: