第二章 数据结构(二)
生活随笔
收集整理的這篇文章主要介紹了
第二章 数据结构(二)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- Trie
- 835 Trie 字符串統計
- 并查集
Trie
高效存儲和查找字符串集合的數據結構
有結尾標記,邊創建節點,邊存儲
835 Trie 字符串統計
維護一個字符串集合,支持兩種操作:
I x 向集合中插入一個字符串 x;
Q x 詢問一個字符串在集合中出現了多少次。
共有 N 個操作,輸入的字符串總長度不超過 105,字符串僅包含小寫英文字母。
輸入格式
第一行包含整數 N,表示操作數。
接下來 N 行,每行包含一個操作指令,指令為 I x 或 Q x 中的一種。
輸出格式
對于每個詢問指令 Q x,都要輸出一個整數作為結果,表示 x 在集合中出現的次數。
每個結果占一行。
數據范圍
1≤N≤2?104
輸入樣例:
輸出樣例:
1 0 1 #include <iostream>using namespace std;const int N = 100010;// son[N][26] N 代表的是第多少個新的節點 // cnt[N] 代表以某個節點結尾的單詞有多少個 // idx 表示當前查看到第多少個單詞 int son[N][26], cnt[N], idx; // 下標是0的點,既是根節點又是空節點 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 quiry(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;cin >> n;while (n -- ) {char op[2];scanf("%s%s", op, str);if (op[0] == 'I') insert(str);else printf("%d\n", quiry(str));}return 0; }接收一個字符用c會很麻煩,不如直接使用%s接收,浪費一點空間
并查集
兩個集合合并
兩個元素是否在一個集合當中
總結
以上是生活随笔為你收集整理的第二章 数据结构(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第二章 数据结构(一)
- 下一篇: 打字练习网站使用感受