acwing 835. Trie字符串統計

地址  https://www.acwing.com/problem/content/description/837/ios

維護一個字符串集合,支持兩種操做:web

  1. 「I x」向集合中插入一個字符串x;
  2. 「Q x」詢問一個字符串在集合中出現了多少次。

共有N個操做,輸入的字符串總長度不超過 105105,字符串僅包含小寫英文字母。ui

輸入格式

第一行包含整數N,表示操做數。spa

接下來N行,每行包含一個操做指令,指令爲」I x」或」Q x」中的一種。code

輸出格式

對於每一個詢問指令」Q x」,都要輸出一個整數做爲結果,表示x在集合中出現的次數。xml

每一個結果佔一行。blog

數據範圍

1N2104ip

輸入樣例:
5
I abc
Q abc
Q ab
I ab
Q ab
輸出樣例:
1
0
1

trie 樹的模板題ci

解法1 使用trie樹解決rem

#include <iostream>

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];
    }
    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 == 'I') insert(str);
        else printf("%d\n", query(str));
    }

    return 0;
}

 

解法2  使用哈希解決

#include <iostream>
#include <map>
#include <string>

using namespace std;

map<string,int> re;




const int N = 100010;

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


void insert(char str[]){
    re[str]++;
}

int query(char str[]){
    return re[str];
}


int main()
{
      int n;
    scanf("%d", &n);
    while (n -- )
    {
        char op[2];
        scanf("%s%s", op, str);
        if (*op == 'I') insert(str);
        else printf("%d\n", query(str));
    }
    
    return 0;
}

 

輸入樣例:

5
I abc
Q abc
Q ab
I ab
Q ab

輸出樣例:

1
0
1
相關文章
相關標籤/搜索