|算法讨论|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  
#include  
#include  
#include  
#include  
#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;iint 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;iint 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;  
}  

你可能感兴趣的:(算法讨论,字符串,-,Trie树)