zoukankan      html  css  js  c++  java
  • 前缀统计

    题目链接:https://www.acwing.com/problem/content/144/

    题意: 给定N个字符串S1,S2SNS1,S2…SN,接下来进行M次询问,每次询问给定一个字符串T,求S1S1~SNSN中有多少个字符串是T的前缀。

    思路:可以把这N个字符串插入一棵Trie字典树,Trie树的每个节点上存储一个整数ans,记录该节点是多少个字符串的末尾节点。对于每个询问,在Trie

              树中检索T,在检索过程中累加途径的每个节点的cnt值,就是该询问的答案

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    int trie[1000010][30],b[1000010];
    int tot=1;
    char a[1000010];
    void insert(char a[])
    {
        int n=strlen(a);
        int p=1;
        for(int i=0;i<n;i++)
        {
            int w=a[i]-'a';
            if(trie[p][w]==0)
                trie[p][w]=++tot;
            p=trie[p][w];
        }
        b[p]++;
        return;
    }
    int fun(char a[])
    {
        int n=strlen(a);
        int sum=0,p=1;
        for(int i=0;i<n;i++)
        {
            int w=a[i]-'a';
            if(trie[p][w]==0)
                break;
            p=trie[p][w];
            sum+=b[p];
        }
        return sum;
    }
    int main()
    {
        int n,m;
        scanf("%d %d",&n,&m);
        for(int i=0; i<n; i++)
        {
            scanf("%s",a);
            insert(a);
        }
        for(int i=0;i<m;i++)
        {
            scanf("%s",a);
            int sum=fun(a);
            printf("%d
    ",sum);
        }
        return 0;
    }
  • 相关阅读:
    浅析TCP /UDP/ IP协议
    大小端模式
    小技巧—计算内存
    浅谈启发式合并
    浅谈换根DP
    POJ 3585 Accumulation Degree
    OSGi类加载问题
    Redis缓存集群方案
    Tair分布式缓存
    Tedis:淘宝的Redis的Java客户端开发包
  • 原文地址:https://www.cnblogs.com/zcb123456789/p/11299875.html
Copyright © 2011-2022 走看看