ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

835. Trie字符串统计

2022-09-17 00:02:06  阅读:259  来源: 互联网

标签:26 835 Trie 字母 son int str 字符串


这个问题在于理解son这个数组,首先字典树可以理解为一层一层的,
首先,为什么是son[N][26]最长长度的字符串有N个字母,每个字母有26种可能所以就是这样。(其实一共字符串比如abc,可以算三种情况, a, ab, abc。)
比如这个:

son[0]就理解为第一层,也就是字符串第一个字符,对应字符串的第一个字母的26个可能的字母,所以有26个位置,字符串第二个字母就是son[1],也有26种可能,
而son[0][0],假如第一个加入的字符串abc第一个字母为a这个son[0][0]这一项就等于1,然后son[1][1]等于2,son[2][2]等于3,(这里的 1 2 3 就是idx(idx就是第几种情况))
(100000个字符串所以有100000种情况,son[][]对应的值就是每一项对应结尾的序号,此时cnt[son[][]]++)
第二个字符串abd就 a和b都已经出现过了所以一直到
第三个字母son[2][3]等于4,表示此前的字符串都不符合当前这个情况,出现的第四种情况。

#include<bits/stdc++.h> 
using namespace std;

const int N = 100010;

int son[N][26], cnt[N], idx;
char str[N];

void insert(char str[]) {
    int p = 0;  //类似指针,指向当前节点
    for(int i = 0; str[i]; i++)
    {
        int u = str[i] - 'a'; //将字母转化为数字
        if(!son[p][u]) son[p][u] = ++idx;
        //该节点不存在,创建节点,其值为下一个节点位置
        p = son[p][u];  //使“p指针”指向下一个节点位置
    }
    cnt[p] ++ ;
}
int query(char str[]) {
    int p = 0;
    for (int i = 0; str[i]; i++) {
        int u = str[i] - 'a';
        if(!son[p][u]) return 0;
        p = son[p][u];
    }
    return cnt[p];
}
int main() {
    int n;
    scanf("%d", &n);
    while(n --) {
        char op[2];
        scanf("%s%s", op, str);
        if(op[0] == 'I') insert(str);
        else printf("%d\n", query(str));
    }
}

标签:26,835,Trie,字母,son,int,str,字符串
来源: https://www.cnblogs.com/echoT/p/16695069.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有