//竟然用sort排序之后的做法比trie还要快!应该我对trie的掌握还不够熟练吧!
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
int tc, i, n;
string str[10010];
bool flag;
cin >> tc;
while (tc--){
cin >> n;
flag = true;
for (i = 0; i < n; i++)
cin >> str[i];
sort(str, str+n); //进行排序之后,如果是有前缀关系的,就是其邻居的字符,这样就减少了比较的次数!
for (i = 0; i < n-1; i++){//前一个字符串和后一个字符串进行比较就可以了!如果是有前缀关系的就停止比较,输出结果!
int len;
len = str[i].length();
string tmp = str[i+1].substr(0, len);
if (tmp == str[i]){
flag = false;
break;
}
}
if (flag)
cout << "YES" << endl;
else
cout << "NO" << endl;
}
system("pause");
}
//刚开始用trie 的时候,由于用了new,所以就超时了,看了别人的代码才明白,需要开静态数组才可以的!
//其实还可以优化,进行在Tire树插入的过程中进行Tire树的查询工作!
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int ct;
struct TireNode
{
int count;
struct TireNode *branch[10];
TireNode()
{
count = 0;
for (int i = 0; i < 10; i++)
branch[i] = NULL;
}
}NodeNum[100000];//静态数组储存Tire树结点!
//Tire树的插入操作!
void TireInsert(TireNode *&root, string str)
{
int i, len;
len = str.length();
TireNode *p = root;
for (i = 0; i < len; i++){
if (!p->branch[str[i]-'0']){
p->branch[str[i]-'0'] = &NodeNum[ct];
ct++;
}
p = p->branch[str[i]-'0'];
p->count++;
}
return ;
}
//Tire树的查询操作!
bool TireSearch(TireNode *root, string str)
{
if (root == NULL)
return 0;
int i, len;
len = str.length();
TireNode *p = root;
for (i = 0; i < len; i++){
p = p->branch[str[i]-'0'];
if (p->count == 1)
return 1;
}
return 0;
}
int main()
{
int tc, i, n;
string phone[10010];
bool flag;
cin >> tc;
while (tc--){
cin >> n;
flag = true;
memset(NodeNum, NULL, sizeof(NodeNum));
TireNode *root = &NodeNum[0];
ct = 1;
for (i = 0; i < n; i++){
cin >> phone[i];
TireInsert(root, phone[i]);
}
sort(phone, phone+n);
for (i = 0; i < n; i++){
if (!TireSearch(root, phone[i])){
flag = false;
break;
}
}
if (flag)
cout << "YES" << endl;
else
cout << "NO" << endl;
}
system("pause");
}
poj 3630 Phone List
最新推荐文章于 2022-04-09 22:40:57 发布