hdu2328 后缀树
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
#include <stack>
#include <deque>
#include <iostream>
using namespace std;
typedef long long LL;
const int MOD = 1000000007;
const int maxn = 40009 + 5; int tree[maxn][30];
int sum[maxn];
int tot;
char ss[maxn], mid[maxn], ans[maxn]; void insert(char *str)
{
int len = strlen(str);
int root = 0;
for (int i = 0; i < len; i++)
{
int id = str[i] - 'a';
if (!tree[root][id])
tree[root][id] = ++tot; if (sum[tree[root][id]] + 1 >= 1)
{
sum[tree[root][id]] = 1;
}
else
{
break;
} root = tree[root][id]; }
} int find(char *str, int x)
{
int len = strlen(str);
int root = 0, deep = 0;
for (int i = 0; i < len; i++)
{
int id = str[i] - 'a';
if (tree[root][id])
{
if (sum[tree[root][id]] + 1 >= x)
{
sum[tree[root][id]] = x;
deep++;
}
else
{
break;
}
root = tree[root][id];
}
else
{
break;
}
} return deep;
} int main()
{ int n, i, j, k, head; while (scanf("%d", &n) != EOF)
{
if(n == 0)
break; memset(tree, 0, sizeof(tree));
memset(sum, 0, sizeof(sum));
memset(ans, 0, sizeof(ans));
tot = 1; for (i = 1; i < n; i++)
{
scanf(" %s", ss);
k = strlen(ss);
//cout << "input: " << ss << endl;
if (i == 1)
{
for (j = 0; j < k; j++)
{
// printf("%s\n", &ss[j]);
insert(&ss[j]);
}
}
else
{
for (j = 0; j < k; j++)
{
find(&ss[j], i);
}
}
} head = 0;
scanf(" %s", ss);
//cout << "Nth: " << ss << endl;
k = strlen(ss);
// cout << "follows " << endl;
for (j = 0; j < k; j++)
{
// cout << &ss[j] << endl;
int len = find(&ss[j], n); mid[0] = 0;
strncpy(mid, ss + j, len);
mid[len] = 0;
// printf("mid: %s\n", mid); if (len > head || (len == head && strcmp(mid, ans) < 0))
{
head = len;
ans[0] = 0;
strcpy(ans, mid);
// printf("ans: %s\n", ans);
}
} if (head == 0)
{
printf("IDENTITY LOST\n");
}
else
{
printf("%s\n", ans);
}
// cout << " n: " << n << endl;
} return 0;
}
后缀树的思想和字典树一样,不过是依次把字符串的所有后缀加入到树中。
需要整理的知识:后缀树的O(n)优化、后缀自动机、后缀数组
hdu2328 后缀树的更多相关文章
- 后缀树(suffix tree)
参考: 从前缀树谈到后缀树 后缀树 Suffix Tree-后缀树 字典树(trie树).后缀树 一.前缀树 简述:又名单词查找树,tries树,一种多路树形结构,常用来操作字符串(但不限于字符串), ...
- 字符串 --- KMP Eentend-Kmp 自动机 trie图 trie树 后缀树 后缀数组
涉及到字符串的问题,无外乎这样一些算法和数据结构:自动机 KMP算法 Extend-KMP 后缀树 后缀数组 trie树 trie图及其应用.当然这些都是比较高级的数据结构和算法,而这里面最常用和最熟 ...
- 后缀树系列一:概念以及实现原理( the Ukkonen algorithm)
首先说明一下后缀树系列一共会有三篇文章,本文先介绍基本概念以及如何线性时间内构件后缀树,第二篇文章会详细介绍怎么实现后缀树(包含实现代码),第三篇会着重谈一谈后缀树的应用. 本文分为三个部分, 首先介 ...
- 【Todo】字符串相关的各种算法,以及用到的各种数据结构,包括前缀树后缀树等各种树
另开一文分析字符串相关的各种算法,以及用到的各种数据结构,包括前缀树后缀树等各种树. 先来一个汇总, 算法: 本文中提到的字符串匹配算法有:KMP, BM, Horspool, Sunday, BF, ...
- [转载]字典树(trie树)、后缀树
(1)字典树(Trie树) Trie是个简单但实用的数据结构,通常用于实现字典查询.我们做即时响应用户输入的AJAX搜索框时,就是Trie开始.本质上,Trie是一颗存储多个字符串的树.相邻节点间的边 ...
- 后缀树(Suffix Tree)
问题描述: 后缀树(Suffix Tree) 参考资料: http://www.cppblog.com/yuyang7/archive/2009/03/29 ...
- 关于广义后缀树(多串SAM)的总结
之前我们给的SAM的例题,基本上是一个串建SAM的就能做的 如果要建多个串的SAM应该怎么做呢 首先看题,bzoj2780 我一开始的想法是SA以前的弄法,把串拼起来,中间加分隔符做SAM 这题确实可 ...
- 康复计划#1 再探后缀自动机&后缀树
本篇口胡写给我自己这样的东西都忘光的残废选手 以及那些刚学SAM,看了其他的一些东西并且没有完全懵逼的人 (初学者还是先去看有图的教程吧,虽然我的口胡没那么好懂,但是我觉得一些细节还是讲清楚了的) 大 ...
- 广义后缀树(GST)算法的简介
导言 最近软件安全课上,讲病毒特征码的提取时,老师讲了一下GST算法.这里就做个小总结. 简介 基本信息 广义后缀树的英文为Generalized Suffix Tree,简称GST. 算法目的 ...
随机推荐
- Redis的各个数据的类型基本命令
什么是Redis: 概念: Redis (REmote DIctionary Server) 是用 C 语言开发的一个开源的高性能键值对(key-value)数据库. 特征:1. 数据间没有必然的关联 ...
- JavaScript学习—基本类型—Number
在JavaScript中,采用IEEE754表示整数和浮点数 整数 十进制 let num10 = 10 八进制 let num8 = 0(1~7) JavaScript中,八进制数值以0作为前导,后 ...
- 拦截器——原理(AOP、责任链模式、配置)
1.Struts2拦截器概述: (1)Struts2框架封装中封装了很多功能,这些功能其实都是封装在Struts2的拦截器里面,Struts2里面有很多拦截器,每次不是这些拦截器都执行,每次只执行默认 ...
- 手动安装 saltshaker-plus 版本选择特别说明(后期重点讲解Docker安装方式)
前后端都建议使用1.12版本
- P1642 规划 [01分数规划]
裸题,考虑size完了跑一个树上背包,这题没了. // by Isaunoya #include <bits/stdc++.h> using namespace std; #define ...
- jenkins自动化部署(tomcat+git)
一.安装jenkins 1.安装jdk 查看可安装版本:yum search openjdk 安装:yum install -y java-1.8.0-openjdk java-1.8.0-openj ...
- gulp常用插件之gulp-rev-collector使用
更多gulp常用插件使用请访问:gulp常用插件汇总 gulp-rev-collector这是一款根据gulp-rev生成的manifest.json文件中的映射, 去替换文件名称, 也可以替换路径. ...
- php实现简易留言板效果
首先是Index页面效果图 index.php <?php header('content-type:text/html;charset=utf-8'); date_default_timezo ...
- Java 中多态的实现(下)
Java 中多态的另一个语法实现是重写.重载是通过静态分派实现的,重写则是通过动态分派实现的. 在学习动态分派之前,需要对虚拟机的知识有一个初步的了解. 虚拟机运行时数据区 运行 Java 程序时,虚 ...
- babel 的简单使用
之前在项目中使用.balelrc文件,但是一直不知道具体怎么使用,就知道可以将es6语法转码为es5语法. 今天就简单的做个例子,也算是记录一下困扰了好久的问题. 转码步骤: 首先在项目的目录中安装B ...