poj1056 (Trie入门)寻找字符串前缀
题意:给你一堆字符串,问是否满足对于任意两个字符串a、b,a不是b的前缀
字典树==前缀树==Trie树
trie入门题,只用到了insert和query操作
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
#define maxnode 1000
#define sigma_size 30 //struct Trie
//{
int ch[maxnode][sigma_size]; //ch[i][j]:记录结点i的那个编号为j的子节点
int val[maxnode]; //val[i]:i节点的附加信息,这里我们用来记录是否到一个单词的结束
//(即在trie树上root->i一路下来是否是一个完整的单词)
int sz;
void Trie()
{
sz=;
memset(ch[],,sizeof(ch[]));
}
int idx(char c) //idx(c)即字符c的编号。
{
return c-''; //此处第一个字符是0所以return c-'0'
}
void Insert(string s,int v)
{
int u=,n=s.length();
for (int i=;i<n;i++)
{
int c=idx(s[i]);
if (!ch[u][c])
{
memset(ch[sz],,sizeof(ch[sz]));
val[sz]=;
ch[u][c]=sz++;
}
u=ch[u][c];
}
val[u]=v;
}
bool query(string s) //true:s is a prefix
{
int u=,c;
for (int i=;i<s.length();i++)
{
c=s[i]-'';
if (!ch[u][c]) return false; u=ch[u][c];
if (val[u]==) return true; //若此时s还没走完但trie树上已经走到结尾了,即树上单词是s的前缀
}
return true;
}
//}; bool ok;
string str; int main()
{
//freopen("in.txt","r",stdin); ok=true;
Trie();
int num=;
while (cin>>str)
{
if (str=="")
{
num++;
if (ok)
printf("Set %d is immediately decodable\n",num);
else
printf("Set %d is not immediately decodable\n",num);
ok=true;
Trie();
}
else
{
if (query(str))
ok=false;
Insert(str,);
}
}
}
扩展:
1.用trie实现字符串排序?
直接对trie树前序遍历一遍即可
http://www.cnblogs.com/shuaiwhu/archive/2012/05/05/2484676.html
2.trie还有删除操作,不过实现比较麻烦。先mark一个
http://www.cnblogs.com/dolphin0520/archive/2011/10/11/2207886.html
3.trie在中文分词中的应用
http://blog.csdn.net/wzb56_earl/article/details/7902669
poj1056 (Trie入门)寻找字符串前缀的更多相关文章
- POJ 1056 IMMEDIATE DECODABILITY Trie 字符串前缀查找
POJ1056 给定若干个字符串的集合 判断每个集合中是否有某个字符串是其他某个字符串的前缀 (哈夫曼编码有这个要求) 简单的过一遍Trie就可以了 #include<iostream> ...
- Swift入门篇-字符串和字符
今天主要是介绍一下字符串的用法 ,字符串的语法和object-c语法不太一样,但是思想是一样,就是写法不太一样.如果您对.net和java语法比较熟悉的话,那您几乎没有深压力.如果您对swift 基本 ...
- Trie(字典树、前缀树)
目录 什么是Trie? 创建一棵Trie 向Trie中添加元素 Trie的查询操作 对比二分搜索树和Trie的性能 leetcode上的问题 什么是Trie? Trie是一个多叉树,Trie专门为 ...
- 利用Manacher算法寻找字符串中的最长回文序列(palindrome)
寻找字符串中的最长回文序列和所有回文序列(正向和反向一样的序列,如aba,abba等)算是挺早以前提出的算法问题了,最近再刷Leetcode算法题的时候遇到了一个(题目),所以就顺便写下. 如果用正反 ...
- OO的奇妙冒险——OOP入门与字符串处理
OO的奇妙冒险 ~OOP入门与字符串处理~ 总体分析 公测 中测(基础与进阶): 其实在我看来,从完成作业的角度来说,中测的基础与进阶并没有任何区别,都不能挂,都不太难,都对得分没有什么影响.中测的样 ...
- HDU 3336 输出包括从1到len长 字符串前缀的总个数(+DP)
Sample Input14abab Sample Output6输出包括从1到len长 字符串前缀的总个数abab:包括2个a,2个ab,1个aba,1个abab # include <cst ...
- 实现一个算法,寻找字符串中出现次数最少的、并且首次出现位置最前的字符 如"cbaacfdeaebb",符合要求的是"f",因为他只出现了一次(次数最少)。并且比其他只出现一次的字符(如"d")首次出现的位置最靠前。
实现一个算法,寻找字符串中出现次数最少的.并且首次出现位置最前的字符如"cbaacfdeaebb",符合要求的是"f",因为他只出现了一次(次数最少).并且比其 ...
- python3入门之字符串
获得更多资料欢迎进入我的网站或者 csdn或者博客园 经过前面的介绍相信大家也对python有了一个初步的了解:本节主要介绍字符串,不管学习什么编语言字符串一定在其中扮演着重要的地位.本节主要讲解,字 ...
- POJ:2406-Power Strings(寻找字符串循环节)
Power Strings Time Limit: 3000MS Memory Limit: 65536K Description Given two strings a and b we defin ...
随机推荐
- linux强制用户下线
Linux系统为多用户多任务系统,因此允许多个用户登录到系统,有时候,我们需要强制某些用户下线. 前提:必须是root权限操作:(1)使用who查看目前有哪些用户登录了服务器,见下图 [root@vm ...
- 爆炸吧 js dom ---------> boom
dom-> html css 事件 元素 eventlistener HTML 事件的例子: 当用户点击鼠标时 当网页已加载时 当图像已加载时 当鼠标移动到元素上时 当输入字段被改变时 当提交 ...
- smarty中section遍历数组
smarty中section遍历数组
- 类图和对象图教程-类(Class)、接口(Interface)、协作(collaboration)、依赖关系(Dependency)、泛化关系(Generalization)、关联关系(Association)以及实现关系(Realization)
类图的概念 (转) 一.概述 类图(Class Diagram)是描述类.接口.协作以及它们之间关系的图,用来显示系统中各个类的静态结构.类图是定义其他图的基础,在类图基础上,可以使用状态图.协作图. ...
- heartbeat初探
1,概念及原理 http://www.mingxiao.info/tag/heartbeat/
- g++编译总结
g++编译&&gdb调试&&coredump调试 一.编译注意细节 1.使用g++编译CPP文件如果用gcc编译C++源文件时,加以下选项:-lstdc++,否则使用了 ...
- [CareerCup] 13.4 Depp Copy and Shallow Copy 深拷贝和浅拷贝
13.4 What is the difference between deep copy and shallow copy? Explain how you would use each. 这道题问 ...
- Fork一个仓库
Fork 是对一个仓库的克隆.克隆一个仓库允许你自由试验各种改变,而不影响原始的项目. 一般来说,forks 被用于去更改别人的项目(贡献代码给已经开源的项目)或者使用别人的项目作为你自己想法的初始开 ...
- iOS中归档对象的创建,数据写入与读取
归档(archiving)是指另一种形式的序列化,但它是任何对象都可以实现的更常规的模型.专门编写用于保存数据的任何模型对象都应该支持归档.比属性列表多了很良好的伸缩性,因为无论添加多少对象,将这些对 ...
- java并发:获取线程执行结果(Callable、Future、FutureTask)
初识Callable and Future 在编码时,我们可以通过继承Thread或是实现Runnable接口来创建线程,但是这两种方式都存在一个缺陷:在执行完任务之后无法获取执行结果.如果需要获取执 ...