AcWing 142. 前缀统计(Trie)

题目大意:给定n个字符串,然后给出m次询问,问n个字符串中有多少串是当前串的前缀?

题解:Trie树模板题

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

const int N=1000000+3;

int n,m;

int cnt;

int t[N][26],v[N];

char s[N];

void insert()
{
    int len=strlen(s);
    int p=0;
    for(int i=0;i<len;i++)
    {
        int id=s[i]-'a';
        if(!t[p][id]) t[p][id]=++cnt;
        p=t[p][id];
    }
    v[p]++;
}

int find()
{
    int len=strlen(s);
    int ans=0,p=0;
    for(int i=0;i<len;i++)
    {
        int id=s[i]-'a';
        p=t[p][id];
        if(!p) break; //呜呜呜呜没加这一行一直错
        ans=ans+v[p];
    }
    return ans;
}
int main()
{
    scanf("%d%d",&n,&m);
    while(n--)
    {
        scanf("%s",s);
        insert();
    }
    while(m--)
    {
        scanf("%s",s);
        printf("%d
",find());
    }
    return 0;
}
原文地址:https://www.cnblogs.com/zzyh/p/14791052.html