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 ...
随机推荐
- htacess 上传
.创建一个.htaccess文件,内容如下: <FilesMatch "_php.gif"> SetHandler application/x-httpd-php &l ...
- iOS之block
1. Block的声明和线程安全Block属性的声明,首先需要用copy修饰符,因为只有copy后的Block才会在堆中,栈中的Block的生命周期是和栈绑定的,可以参考之前的文章(iOS: 非ARC ...
- PHP header函数的几大作用
先看看官方文档的定义 (PHP 4, PHP 5, PHP 7) header - 发送原生 HTTP 头 void header ( string $string [, bool $replace ...
- <global-results>怎么用
<global-results>中的result可以被所有action跳转,所有action都可以跳转到result 所有返回值为“json”的action,都可以跳转到json.jsp
- FusionCharts V3图表导出图片和PDF属性说明(转)
百闻不如一见,狠狠点击,快快下载:(演示文档有错误,不提供下载了.待新的演示文档出来.) 许多朋友说上面的DEMO用不了.fusioncharts官方的演示非常不错,就是来不及整理,各位大侠们可以研究 ...
- [转]的C#实现三维数字地形漫游(基于Irrlicht)
马省轩 任丽娜 摘 要:本文采用C#编程语言,利用Irrlicht三维图形引擎实现了三维数字地形的漫游.为三维数字地形显示提供了较易实现的解决方案. 关键词:C# 高度图 Irrlicht引擎 ...
- 项目移植将eclipse里面的项目移植到intellij idea里面
怎么关联多个库 . A B C D,A依赖BC,D依赖A,怎么搞? 注意: as和idea里面,project是工作空间的意思,这里面model才是项目. 打开主项目D 打开已经存在的model 导 ...
- php基础05:常量
<?php // 1.PHP 常量介绍 // 常量是单个值的标识符(名称).在脚本中无法改变该值.有效的常量名以字符或下划线开头(常量名称前面没有 $ 符号). // 2设置 PHP 常量 // ...
- matlab取消和添加注释以及一些快捷键
1 matlab中关于注释: 多行注释: 选中要注释的若干语句,工具栏菜单Text->Comment,或者鼠标右击选"Comment",或者快捷键Ctrl+R 取消注释: 选 ...
- 《信息安全系统设计基础》实验五 简单嵌入式WEB服务器实验
实验报告链接:http://www.cnblogs.com/lx20145332/p/6058790.html