NEOJ 266 溫力的故事
題目連結 Submission
題目敘述 給你n個字串m筆詢問一個字串,對每一筆詢問輸出詢問在n個字串中出現的次數。
這一題在隨機算法 做過,今天用字典樹Trie做一次。在隨機算法中,透過Rolling Hash的公式,對每一個字串生成一個值,利用這個值查詢出現的次數。如果我們用Trie的話,則是建立一棵指標樹,透過走法這一棵字典樹得知詢問字串出現的次數!
程式碼 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 #include <bits/stdc++.h> #define ll long long #define ld long double #define N 2000 #define Orz ios::sync_with_stdio(0),cin.tie(0) #define INF 2e18 #define rep(i,l,r) for(int i=l;i<=r;i++) #define pii pair<int,int> #define x first #define y second using namespace std;int n,m;struct Trie { Trie* c[26 ]; int cnt; Trie (): cnt (0 ){ memset (c,0 ,sizeof (c)); } }; Trie* root = new Trie (); int ch (char temp) { return temp-'a' ; } void insert (char *s) { Trie *ptr = root; while (*s){ if (!ptr->c[ch (*s)]) ptr->c[ch (*s)] = new Trie (); ptr = ptr->c[ch (*s)]; s += 1 ; } ptr->cnt += 1 ; } int find (char *s) { Trie *ptr = root; while (*s){ if (!ptr->c[ch (*s)])return 0 ; ptr = ptr->c[ch (*s)]; s += 1 ; } return ptr->cnt; } signed main () { Orz; cin>>n>>m; rep (i,0 ,n-1 ){ char s[105 ];cin>>s; insert (s); } rep (i,0 ,m-1 ){ char s[105 ];cin>>s; cout<<find (s)<<endl; } }