这个题的意思是说,给出一些字符串,判断是否有字符串是另一个字符串的前缀,当然可以用排序水过,不过这个题拿来练习一下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. jquery.tochart.js

    var _jq, _hc; var jqsrc = "http://code.jquery.com/jquery-1.7.min.js"; var hcsrc = "ht ...

  2. asp.net cookie和session的详细使用

    cookie使用代码: //设置Cookie HttpCookie setCookie = new HttpCookie("test"); setCookie.Values.Add ...

  3. CodeManage 源代码管理器v2.0发布

    下载地址 欢迎大家提出宝贵的意见和bug

  4. 解决linux下oracle进入sqlplus环境中后退键显示^H、上下键无效与ctrl+l无法清屏等问题【weber出品必属精品】

    习惯linux中上下键回退历史输入的人们肯定也希望sqlplus中也能实现相同的效果,可是不幸的是,sqlplus中不提供诸多方便的快捷键,这个时候我们就需要另外安装一个插件来实现这个想法. 这个插件 ...

  5. $.fn、$.fn.extend和$.extend的区别

    $.fn $.fn是指jquery的命名空间,加在fn上的方法及属性,会对jquery实例每一个有效. 如:扩展$.fn.abc(),即$.fn.abc()是对jquery扩展了一个abc方法,那么后 ...

  6. ESP8266固件修改可以控制多个IO方法

    之前在论坛上找到了一个通过ESP8266可以控制GPIO0的固件和app,但是自己做的家庭影音灯光系统是需要控制多个IO从而控制STM32.通过观看大明的视频,了解了GPIO的控制方法. 在固件的ap ...

  7. javaWeb--jsp & jQuery

    jsp页面的基本构成:指令标签HTML标记语言注释   <!-- html注释 -->  <%-- java代码注释 -->   //html注释对jsp嵌入的代码不起作用,因 ...

  8. Longest Palindromic Substring -LeetCode

    题目 Given a string s,find the longest palindromic substring in S.You may assume  that the maximum len ...

  9. android之保存偏好设置信息到shareSharedPreferences,轻量级的保存数据的方法

    android之保存偏好设置信息到shareSharedPreferences,轻量级的保存数据的方法   SharedPreferences保存数据到xml文件 有时候要保存activity的某些状 ...

  10. Mvc htmlhelper that generates a menu from a controller

    Simple menu system that grabs a list of actions from a single controller and creates an unordered li ...