【Trie】查单词(C++)

[Submit][Status][Web Board]

Description

全国英语四级考试就这样如期到来了,可是小Y依然没有做好充分准备。为了能大学毕业,可怜的小Y准备作弊。
小Y费尽心机,在考试的时候夹带了一本字典进考场。现在的问题是:考试的时候可能有很多单词要查,小Y能不能来得及呢?

Input

第一行一个整数N,表示字典中一共有多少个单词。
接下来每两行表示一个单词,其中:第一行是一个长度≤100的字符串,表示这个单词,全部是小写字母,单词不会重复;第二行是一个整数,表示这个单词在字典中的页码。
接下来一行是一个整数M,表示要查的单词数。
接下来M行,每行一个字符串,表示要查的单词,保证在字典中存在。
N≤10000,M≤10000

Output

M行,每行一个整数,表示第i个单词在字典中的页码。

Sample Input

2
scan
10
word
15
2
scan
word

Sample Output

10
15

HINT

[Submit][Status]

trie【字典树】模板题,直接看代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+10;
char str[110];
int a[maxn][26],tot,End[maxn];
void ins(char *str,int f) {
    int n=strlen(str),p=0;
    for(int i=0;i<n;i++)
    {
        int l=str[i]-'a';
        if (!a[p][l])
            a[p][l]=++tot;
        p=a[p][l];
    }
    End[p]=f;
}
int find(char *str) {
    int n=strlen(str),p=0;
    for(int i=0;i<n;i++)
    {
        int l=str[i]-'a';
        p=a[p][l];
        if(!p)return 0;
    }
    return End[p];
}
int main() {
    int n,m;
    scanf("%d",&n);
    tot=0;
    for(int i=1;i<=n;i++)
    {
        int f;
        scanf("%s%d",str,&f);
        ins(str,f);
    }
    scanf("%d",&m);
    for(int i=1;i<=m;i++)
    {
        scanf("%s",str);
        printf("%d\n",find(str));
    }

    return 0;
}
原创文章 75 获赞 126 访问量 1万+

猜你喜欢

转载自blog.csdn.net/liuzich/article/details/105174315
今日推荐