trie

POJ 3630

给出n个字符串,问是否存在一个字符串是另一个的前缀。

# include <cstring>
# include <cstdio>
const int maxlen = 15;
const int maxw = 10;
const int maxn = 10005 * maxw;
char str[maxlen];
int n;
int root, id;
int next[maxn][maxw];
bool lc[maxn];
bool check_add(int e, int ch)
{
    if (next[e][ch]) return true;
    next[e][ch] = ++id;
    lc[id] = false;
    memset(next[id], 0, sizeof(next[id]));
    return false;
}
void solve(void)
{
    bool ans = true;
    scanf("%d", &n);
    id = 0;
    root = 0;
    lc[root] = false;
    memset(next[root], 0, sizeof(next[root]));
    for (int i = 0; i < n; ++i) {
        scanf("%s", str);
        if (!ans) continue;
        int e = root;
        bool local = false;
        for (int j = 0; str[j]; ++j) {
            if ( !check_add(e, str[j]-‘0‘) ) local = true;
            e = next[e][ str[j]-‘0‘ ];
            if (lc[e]) ans = false;
        }
        lc[e] = true;
        if (!local) ans = false;
    }
    printf(ans ? "YES\n":"NO\n");
}
int main()
{
    int T;
    scanf("%d", &T);
    for (int i = 0; i < T; ++i) {
        solve();
    }
    return 0;
}

Uva 11488 Hyper Prefix Sets

给出n个01串,问其所有子集中所有串的公共前缀和串的数目积的最大值。

// http://uva.onlinejudge.org/index.php?option=onlinejudge&page=show_problem&problem=2483
# include <cstring>
# include <cstdio>
# include <algorithm>
const int maxw = 2;
const int maxlen = 205;
const int maxn = 50000 * maxw;
int n;
int root, id;
int cnt[maxn];
int next[maxn][maxw];
bool check_add(int e, int ch) {
    if (next[e][ch]) return true;
    next[e][ch] = ++id;
    cnt[id] = 0;
    memset(next[id], 0, sizeof(next[id]));
    return false;
}
char str[maxlen];
void solve()
{
    int ans = 0;
    scanf("%d", &n);
    root = 0;
    id = 0;
    cnt[root] = 0;
    memset(next[root], 0, sizeof(next[root]));
    for (int i = 0; i < n; ++i) {
        scanf("%s", str);
        int e = root;
        for (int j = 0; str[j]; ++j) {
            check_add(e, str[j]-‘0‘);
            e = next[e][ str[j]-‘0‘ ];
            ++cnt[e];
            ans = std::max(ans, cnt[e]*(j+1));
        }
    }
    printf("%d\n", ans);
}
int main()
{
    int T;
    scanf("%d", &T);
    for (int ica = 0; ica < T; ++ica) {
        solve();
    }
    return 0;
}

leetcode Longest Common Prefix

没在OJ上找到LCP的题,只有leetcode上有(此处省略吐槽1000字)。

这道题是求所有串的LCP,所以裸的字典树足够,代码:

// https://oj.leetcode.com/problems/longest-common-prefix/
# include <vector>
# include <string>
# include <cstring>
# include <algorithm>
# include <iostream>
# define maxnode 1005
using namespace std;
class Solution {
public:
    int root, id;
    int next[maxnode][256];
    int cnt[maxnode];
    bool check_add(int e, int ch) {
        if (next[e][ch]) return true;
        next[e][ch] = ++id;
        memset(next[id], 0, sizeof(next[id]));
        return false;
    }
    string longestCommonPrefix(vector<string> &strs) {
        int n = strs.size();
        if (n <= 0) return string("");
        id = 0;
        root = 0;
        memset(next[root], 0, sizeof(next[root]));
        cnt[root] = 0;
        int ans = 0;
        for (int i = 0; i < n; ++i) {
            int e = root;
            for (int j = 0; strs[i][j]; ++j) {
                check_add(e, strs[i][j]);
                e = next[e][ strs[i][j] ];
                ++cnt[e];
                if (cnt[e] >= n) ans = std::max(ans, j+1);
            }
        }
        return string(strs[0].substr(0, ans));
    }
};
时间: 2024-11-03 11:53:24

trie的相关文章

HDU 1075 What Are You Talking About (Trie树)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1075 map可以过...我上的字典树,小bug有点尴尬,题目没有明确给出数据范围也是无奈. 贡献了几次RE 一次WA.尴尬.discuss里面有个说注意前缀的到是给了点tip.总体来说不错 代码: 1 #define _CRT_SECURE_NO_WARNINGS 2 #include <functional> 3 #include <algorithm> 4 #include <

POJ2778 DNA Sequence Trie+矩阵乘法

题意:给定N个有A C G T组成的字符串,求长度为L的仅由A C G T组成的字符串中有多少个是不含给定的N个字符串的题解: 首先我们把所有的模式串(给定的DNA序列)建Trie,假定我们有一个匹配串,并且在匹配过程到S[i]这个字符时匹配到了Trie上的某个节点t,那么有两种可能: 匹配失败:t->child[S[i]]为空,跳转到t->fail,因此t->fail一定不能是某个模式串的结尾: 匹配成功:跳转到t->child[S[i+1]],因此t->child[S[i

poj3630 Phone List (trie树模板题)

Phone List Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 26328   Accepted: 7938 Description Given a list of phone numbers, determine if it is consistent in the sense that no number is the prefix of another. Let's say the phone catalogu

从Trie谈到AC自动机

ZJOI的SAM让我深受打击,WJZ大神怒D陈老师之T3是SAM裸题orz...我还怎么混?暂且写篇`从Trie谈到AC自动机`骗骗经验. Trie Trie是一种好玩的数据结构.它的每个结点存的是字母,因此得名`字母树`. 出一张图让大家感受下. (image powered by SaiBu NaoCu) 上面那是一棵插入了 ape,app,applicant,application,bake,ban,banana 等词的Trie.红色结点表示接受态. 显然,查找时只需顺着链照下来,插入只需

【BZOJ2741】【块状链表+可持久化trie】FOTILE模拟赛L

Description FOTILE得到了一个长为N的序列A,为了拯救地球,他希望知道某些区间内的最大的连续XOR和. 即对于一个询问,你需要求出max(Ai xor Ai+1 xor Ai+2 ... xor Aj),其中l<=i<=j<=r. 为了体现在线操作,对于一个询问(x,y): l = min ( ((x+lastans) mod N)+1 , ((y+lastans) mod N)+1 ).r = max ( ((x+lastans) mod N)+1 , ((y+last

[算法系列之二十]字典树(Trie)

一 概述 又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计. 二 优点 利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希表高. 三 性质 (1)根节点不包含字符,除根节点外每一个节点都只包含一个字符: (2)从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串: (3)每个节点的所有子节点包含的字符都不相同. 单词列表为"apps&

跳跃表,字典树(单词查找树,Trie树),后缀树,KMP算法,AC 自动机相关算法原理详细汇总

第一部分:跳跃表 本文将总结一种数据结构:跳跃表.前半部分跳跃表性质和操作的介绍直接摘自<让算法的效率跳起来--浅谈"跳跃表"的相关操作及其应用>上海市华东师范大学第二附属中学 魏冉.之后将附上跳跃表的源代码,以及本人对其的了解.难免有错误之处,希望指正,共同进步.谢谢. 跳跃表(Skip List)是1987年才诞生的一种崭新的数据结构,它在进行查找.插入.删除等操作时的期望时间复杂度均为O(logn),有着近乎替代平衡树的本领.而且最重要的一点,就是它的编程复杂度较同类

Trie树学习2

数组实现的Trie树 字符容量有限,可以使用链表实现更为大容量的Trie #include <iostream> #include <cstdio> #include <string> #include <cstring> #include <vector> #include <map> #include <set> #include <algorithm> #include <cstdlib> #

trie树(字典树)

1. trie树,又名字典树,顾名思义,它是可以用来作字符串查找的数据结构,它的查找效率比散列表还要高. trie树的建树: 比如有字符串"ab" ,"adb","adc"   可以建立字典树如图: 树的根节点head不存储信息,它有26个next指针,分别对应着字符a,b,c等.插入字符串ab时,next['a'-'a']即next[0]为空,这是申请一个结点放在next[0]的位置,插入字符串db时,next['d'-'a']即next[3]

Trie 字典树

1.UVa 1401 Remember the Word 题意:给出n个字符串集合,问其有多少种组合方式形成目标字符串. 思路:对n个字符串集合建立Trie树,保存每个结点的字符串的顺序编号.然后对这棵树查找目标字符串每一个后缀的前缀字符串,累加. 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<iostream> 5 #include<vector>