UVALive 5913 字典树

先输入n个字符串的字典,每个字符串的前缀+后缀可以组成新的合法字符串,但肯定是有重复的,问从给定的字符串,生成的所有可能的字符串为多少个

把前缀和后缀压入字典树,达到前缀和后缀的去重,首先的总和即为前缀数目乘以后缀数目,之后为了去重,记录每个前后缀非第一个相同的每个字母,则每个相同字母必定会产生重复。减掉即可。。还要注意,len=1的字符串特判。。注意细节处理

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define LL long long
using namespace std;
int n;
LL sum1,sum2;
LL num1[26],num2[26];
struct node
{
    int ch[400000][26];
    int cnt;
    void init()
    {
        memset(ch,0,sizeof ch);
        cnt=1;
    }
    void inserts(char* str)
    {
        int rt=0;
        int k=0;
        while (str[k])
        {
            int q=str[k]-‘a‘;
            if (ch[rt][q]==0){
                ch[rt][q]=cnt++;
                sum1++;
                if (k>0) num1[q]++;
            }
            rt=ch[rt][q];
            k++;
        }
    }
    void inserts2(char* str)
    {
        int rt=0;
        int k=0;
        while (str[k])
        {
            int q=str[k]-‘a‘;
            if (ch[rt][q]==0){
                ch[rt][q]=cnt++;
                sum2++;
                if (k>0) num2[q]++;
            }
            rt=ch[rt][q];
            k++;
        }
    }
}T1,T2;
char s[50];
int len;
int one[26];
int main()
{

    while (scanf("%d",&n)!=EOF)
    {
        T1.init();
        T2.init();
        sum1=sum2=0;
        memset(one,0,sizeof one);
        memset(num1,0,sizeof num1);
        memset(num2,0,sizeof num2);
        for (int i=0;i<n;i++){
            scanf("%s",s);
            T1.inserts(s);
            len=strlen(s);
            if (len==1) {one[s[0]-‘a‘]=1;}
            reverse(s,s+len);
            T2.inserts2(s);
        }
        LL ans=sum1*sum2;
        //cout<<sum1<<" "<<sum2<<endl;
        for (int i=0;i<26;i++){
            if (one[i]) ans++;
            ans-=num1[i]*num2[i];
        }
        printf("%lld\n",ans);
    }
    return 0;
}

  

UVALive 5913 字典树,布布扣,bubuko.com

时间: 2024-12-09 22:02:22

UVALive 5913 字典树的相关文章

UVALive 5029 字典树

E - Encoded Barcodes Crawling in process...Crawling failedTime Limit:3000MS    Memory Limit:0KB    64bit IO Format:%lld & %llu SubmitStatusPracticeUVALive 5029 Description All the big malls need a powerful system for the products retrieval. Now you a

UVALive 3942 Remember the Word 字典树+dp

/** 题目:UVALive 3942 Remember the Word 链接:https://vjudge.net/problem/UVALive-3942 题意:给定一个字符串(长度最多3e5)和m个单词(每个单词长度最多100).单词都是不同的.该字符串可以由若干个单词组成,问最多有多少种组合方式. 思路:字典树+dp 用字典树处理好m个单词,定义dp[i]表示从i开始的字符串可以由单词组成的方式数. 那么dp[i] += dp[i+j]; j表示某个单词和字符串的[i,i+j-1]匹配

UVALive 7712 Confusing Manuscript 字典树 查询与s的编辑距离为1的字符串数量

/** 题目:UVALive 7712 Confusing Manuscript 链接:https://vjudge.net/problem/UVALive-7712 题意:给定n个不同的字符串,f(i)表示第i个字符串和其他字符串的编辑距离为1的个数. 编辑距离为1表示两个字符串其中一个可以通过删除任意位置某一个字符或者增加任意位置某一个字符或者替换任意位置某一个字符之后,两者匹配. 输出f(i)最大的字符串,如果f(i)==f(j) (i<j) 输出第i个字符串. 思路:字典树 主要是处理细

UVaLive 3942 Remember the Word (dp+字典树)

Remember the Word DescriptionNeal is very curious about combinatorial problems, and now here comes a problem about words. Knowing that Ray has a photographic memory and this may not trouble him, Neal gives it to Jiejie. Since Jiejie can’t remember nu

hdu 1251 统计难题(字典树)

Problem Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀). Input 输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是老师交给Ignatius统计的单词,一个空行代表单词表的结束.第二部分是一连串的提问,每行一个提问,每个提问都是一个字符串. 注意:本题只有一组测试数据,处理到文件结束. Output 对于每个提

51nod round3# 序列分解(折半枚举+字典树)

小刀和大刀是双胞胎兄弟.今天他们玩一个有意思的游戏. 大刀给小刀准备了一个长度为n的整数序列.小刀试着把这个序列分解成两个长度为n/2的子序列. 这两个子序列必须满足以下两个条件: 1.他们不能相互重叠. 2.他们要完全一样. 如果小刀可以分解成功,大刀会给小刀一些糖果. 然而这个问题对于小刀来说太难了.他想请你来帮忙. Input 第一行给出一个T,表示T组数据.(1<=T<=5) 接下来每一组数据,输入共2行. 第一行包含一个整数n (2<=n<=40且为偶数). 第二行给出n

白话算法与数据结构之【字典树】

1. 什么是trie树 1.Trie树 (特例结构树) Trie树,又称单词查找树.字典树,是一种树形结构,是一种哈希树的变种,是一种用于快速检索的多叉树结构.典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计.它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高.      Trie的核心思想是空间换时间.利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的. Trie树也有它的缺点,Trie树的内存消耗非常大.当然,或许用左儿子

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

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

poj 3764 The xor-longest Path(字典树)

题目链接:poj 3764 The xor-longest Path 题目大意:给定一棵树,每条边上有一个权值,找出一条路径,使得路径上权值的亦或和最大. 解题思路:dfs一遍,预处理出每个节点到根节点路径的亦或和rec,那么任意路径均可以表示rec[a] ^ rec[b],所以问题 就转换成在一些数中选出两个数亦或和最大,那么就建立字典树查询即可. #include <cstdio> #include <cstring> #include <algorithm> us