|算法讨论|Trie树 学习笔记

题目


模板及讲解

输入两个整数m,n(m,n<=10),分别代表字典里有m个字符串和有n个查询
接下来m行输入m行字符串,每个字符串长度不超过255,且均为小写字母
接下来n行输入n行询问,如果询问的字符串在字典里,输出1,否则输出0

输入样例

6 4
apple
app
appdl
byu
byuy
ew
app
ew
byyy
appdl

输出样例

1
1
0
1
#include<cstdio>  
#include<algorithm>  
#include<cstring>  
#include<vector>  
#include<string>  
#define ms(i,j) memset(i,j, sizeof i);  
using namespace std;  
int c[2600][26];//Trie   
int p[2600];//标记值,为0则是终点   
int m,n;  
int sz = 0;  
int insert(char *s)  
{  
    int u = 0;//当前节点   
    int l = strlen(s);  
    for (int i=0;i<l;i++)  
    {  
        int ch = s[i]-'a';  
        if (c[u][ch]==0)//没有这个节点   
        {  
            c[u][ch] = ++sz;//创造这个节点   
            u = c[u][ch];  
        }else//向下走   
        {  
            u = c[u][ch];  
        }  
    }  
    p[u] = 0;  
}  
int check(char *s)  
{  
    int u = 0;//当前节点   
    int l = strlen(s);  
    for (int i=0;i<l;i++)  
    {  
        int ch = s[i]-'a';  
        if (c[u][ch]==0)//没有这个节点那么肯定这个查询不存在   
        {  
            return false;  
        }else//向下走   
        {  
            u = c[u][ch];  
        }  
    }  
    if (p[u]==0) return true;//有结束标记的才是存在的   
    return false;  
}  
int main()  
{  
    ms(c,0);//初始化Trie   
    ms(p,-1);   
    scanf("%d%d\n", &m ,&n);  
    for (int i=1;i<=m;i++)  
    {  
        char ch[300];  
        scanf("%s", ch);  
        insert(ch);  
    }  
    for (int i=1;i<=n;i++)     
    {  
        char ch[300];  
        scanf("%s", ch);  
        if(check(ch)) printf("1\n");  
        else printf("0\n");  
    }   
    return 0;  
}  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值