这个题的意思是说,给出一些字符串,判断是否有字符串是另一个字符串的前缀,当然可以用排序水过,不过这个题拿来练习一下Trie树不错。

这个题在poj的discuss上好多人说必须要静态建树,估计都是用了指针实现的。。不过竞赛中最好不要用指针,所以这里用了刘汝佳大神的数组实现方法,其实Trie树最重要的是每个节点的sz值,以及val值,ch【】【】数组只是作为index来查询有没有这个字符,所以用数组实现时,把ch【】【】数组定义在main外面,多case的话每个case定义一个Trie就好了。。。如果把ch【】【】数组定义在结构体里面就没办法动态建树了。。。为此re,wa,了无数发。。。

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<map>
#include<vector>
#include<cmath>
#define eps 1e-8
using namespace std; const int maxn = ;
typedef long long ll;
const int maxnode = 1e5+,sigma_size =;//maxnode和sigma_size的大小要随题意更改
int ch[maxnode][sigma_size];
int val[maxnode];
struct Trie
{
int sz;
Trie(){sz = ;memset(ch[],,sizeof(ch[]));}
int idx(char c) {return c - '';} bool insert(char *s)
{
int u = ,n = strlen(s);
int mark = ;
for(int i = ; i < n; ++i)
{
int c = idx(s[i]);
if(!ch[u][c]){
mark = ;//这是一个新的节点,说明到现在为止,这个串新开辟了位置,肯定不是之前某个串的前缀
memset(ch[sz],,sizeof(ch[sz]));
val[sz] = ;
ch[u][c] = sz++;
}
u = ch[u][c];
if(val[u]) return false;//遇到了之前某个串的结尾。。肯定不符合题意啦。返回false
}
val[u] = ;
if(!mark) return false;//到插入整个字符了还没有开辟新位置,显然新插入的字符串是之前某个串的前缀
return true;
}
};
char s[maxn]; int main()
{
//freopen("in","r",stdin);
int T;
scanf("%d",&T);
while(T--)
{
int n;
bool flag = true; scanf("%d",&n);
Trie t;
for(int i = ; i < n; ++i)
{
scanf("%s",s);
if(flag) flag = t.insert(s);
}
if(!flag) puts("NO");
else puts("YES");
}
}

POJ3630——简单Trie树的更多相关文章

  1. POJ 2418 简单trie树

    Hardwood Species Time Limit: 10000MS Memory Limit: 65536K Total Submissions: 21845 Accepted: 8551 De ...

  2. HihoCoder第二周与POJ3630:Trie树的建立

    这又是两道一样的题,都是建立trie树的过程. HihoCoder第二周: 这里其实逻辑都很简单,主要在于数据结构struct的使用. #include <iostream> #inclu ...

  3. trie树--详解

    文章作者:yx_th000 文章来源:Cherish_yimi (http://www.cnblogs.com/cherish_yimi/) 转载请注明,谢谢合作.关键词:trie trie树 数据结 ...

  4. 转:trie树--详解

    前几天学习了并查集和trie树,这里总结一下trie. 本文讨论一棵最简单的trie树,基于英文26个字母组成的字符串,讨论插入字符串.判断前缀是否存在.查找字符串等基本操作:至于trie树的删除单个 ...

  5. 电话号码 【trie树】

    电话号码 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描写叙述 给你一些电话号码,请推断它们是否是一致的,即是否有某个电话是还有一个电话的前缀. 比方: Emerg ...

  6. POJ 3630 Phone List(trie树的简单应用)

    题目链接:http://poj.org/problem?id=3630 题意:给你多个字符串,如果其中任意两个字符串满足一个是另一个的前缀,那么输出NO,否则输出YES 思路:简单的trie树应用,插 ...

  7. 双数组trie树的基本构造及简单优化

    一 基本构造 Trie树是搜索树的一种,来自英文单词"Retrieval"的简写,可以建立有效的数据检索组织结构,是中文匹配分词算法中词典的一种常见实现.它本质上是一个确定的有限状 ...

  8. 查找(二)简单清晰的B树、Trie树具体解释

    查找(二) 散列表 散列表是普通数组概念的推广.因为对普通数组能够直接寻址,使得能在O(1)时间内訪问数组中的任何位置.在散列表中,不是直接把keyword作为数组的下标,而是依据keyword计算出 ...

  9. 一个简单的统计问题(解决方案:Trie树)

    题目如图   输入几个不重复的单词和几个前缀,分别统计出单词中包含前缀的个数. Trie树   这个题目用到了 Trie 树.它在百度百科中的定义如下:在计算机科学中,Trie,又称字典树.单词查找树 ...

随机推荐

  1. Codeforces Round #322 (Div. 2) —— F. Zublicanes and Mumocrates

    It's election time in Berland. The favorites are of course parties of zublicanes and mumocrates. The ...

  2. C++基础回顾2(函数, 指针和引用)

    接着回顾函数.指针和应用. 函数 1.多维数组作为形参时,第一维的大小可以省略(也可以不省略),但是其他维的大小必须指定.比如二维数组形参,int array[3][]不正确,int arry[][1 ...

  3. linux服务器加入windows域时报错Ticket expired

    [root@rusky]# net ads join -U administrator Enter administrator's password: kinit succeeded but ads_ ...

  4. .NET SQL Server连接字符串句法

    .NET SQL Server连接字符串句法 数据库的连接性已经发展成为应用程序开发的一个标准方面.数据库连接字符串现在已经成为每个项目的标准必备条件.我发现自己为了找到所需要的句法,经常要从另外一个 ...

  5. 实施双工通信框架:SignalR

    SignalR:基于Asp.net平台构建,利用JavaScript或者Websockets,实现在客户端与服务端异步通信的框架. Html5新规范:WebSocket

  6. PDO LIMIT bug

    PDO存在一个LIMIT BUG(mysql) 需要指定数据类型,而且limit后面跟的2个参数必须是数值类型,不然的话获取不到数据 例1: $dsn = "mysql:host=127.0 ...

  7. 关于Jquery.validate.js中动态删除验证remove方法的Bug

    利用Jquery.validate.js 来做动态验证的时候,需要特定的情况下,删除添加opAmount的必须入力的Check $("#form").validate({ rule ...

  8. angular.js学习

    1.第一个小例子 <!DOCTYPE html> <html> <body> <div ng-app=""> <p>在输 ...

  9. 04--帮助类ScreenAdapter编写

    使用VS类向导添加ScreenAdapter,在Num2048项目上右键选择"添加"->"类",然后将生成的两个文件拖放到Classes文件夹中      ...

  10. shopnc怎么开启伪静态 shopnc开启伪静态的方法

    最近要给一个shopnc网站开启伪静态,用的是shopnc b2b2c,在网上搜索了好多shopnc开启伪静态的方法,但都是针对shaopnc c2c的,没有关于shopnc b2b2c的,最后终于找 ...