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. 算法目的 ...
随机推荐
- Game with string CodeForces - 1104B
虽然只是B题,还是div2的 但感觉挺有意思,所以写一篇博客记录一下 最初的想法是利用DP去做,f[s]=true表示字符串s对应先手赢,否则对应后手赢,大致想了下发现是指数级别的算法,看了下范围直接 ...
- Luogu2577 | [ZJOI2005]午餐 (贪心+DP)
题目描述 上午的训练结束了,THU ACM小组集体去吃午餐,他们一行 \(N\) 人来到了著名的十食堂.这里有两个打饭的窗口,每个窗口同一时刻只能给一个人打饭.由于每个人的口味(以及胃口)不同,所以他 ...
- 《操作系统真象还原》ELF文件
下面是第五章部分内容的收获. 用C语言编写内核 一直以来我们都是用汇编语言编写程序的,但接下来我们或许很少用汇编语言编写代码了,大多数都是使用C语言.为什么要这样呢?书上的解释我看的不是很懂,只能结合 ...
- Java内置锁的简单认识
多线程开发离不开锁机制,现在的Java语言中,提供了2种锁,一种是语言特性提供的内置锁,还有一种是 java.util.concurrent.locks 包中的锁,这篇文章简单整理一下内置锁的知识点. ...
- 使用ADO.NET 查询和操作数据
一.使用StringBuilder类追加和删除字符串 1.创建StringBuilder类的对象 StringBuilder sb=new StringBuilder("初始字符串值&quo ...
- PHP自定义函数+系统函数库
全局变量 $n = 5; //全局变量 function fun1(){ global $n; $n++; } fun1(); echo '<hr>'; $n = 6; function ...
- 我的第一个原生Web Components——滑块(SingleSlider)
写着写着,就会跑偏,没错又走上了一个岔道……就是不知道这条岔道以后会不会越来越宽,有的说他是未来,有的说…… 这里不知道,也不做什么评断.减少一些重复性的工作,提高开发效率这是最根本的.说白了就是偷懒 ...
- 518-零钱兑换 II(完全背包-求方案总数)
518-零钱兑换 II(完全背包-求方案总数) 给定不同面额的硬币和一个总金额.写出函数来计算可以凑成总金额的硬币组合数.假设每一种面额的硬币有无限个. 示例 1: 输入: amount = 5, c ...
- substring && substr
let string = '0123456';string.substring(0,3);//start: number, end?: number 012(而非 0123)string.substr ...
- 洛谷P1765 手机_NOI导刊2010普及(10) 关于cin和getline的一些区别 以及一些STL
一. cin>>s:cin>>是由两部分构成的,cin和>>,其中cin是输入流istream类的一个对象,隶属于iostream函数库而>>则是运算符 ...