HDU 1251統計難題 Trie
阿新 • • 發佈:2018-12-13
ACCode:
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int Trie[400001][26]; int sum[400001]; bool v[400001]; int tot; void Insert(char *s) //向整棵樹上插入 s 這個字串 { int len = strlen(s); int root = 0; //從根節點開始向下尋找 for(int i = 0; i < len; i++){ int id = s[i] - 'a'; if(!Trie[root][id]) Trie[root][id] = ++tot; //沒找到字首,新加一個 sum[Trie[root][id]]++; root = Trie[root][id]; } v[root] = true; } int PreCal(char *s) //計算前綴出現的次數 { int root = 0; int len = strlen(s); for(int i = 0; i < len; i++){ int x = s[i] - 'a'; if(!Trie[root][x]) return 0; //以root為頭結點的x字母不存在,返回0 root = Trie[root][x]; //為查詢下一個字母做準備,往下走 } return sum[root]; //OK找到了 } bool Find(char *s) //查詢是否存在這個單詞 { int root = 0; int len = strlen(s); for(int i = 0; i < len; i++){ int x = s[i] - 'a'; if(!Trie[root][x]) return false; root = Trie[root][x]; } return v[root]; } int main() { tot = 0; memset(sum, 0, sizeof(sum)); memset(Trie, 0, sizeof(Trie)); memset(v, 0, sizeof(v)); char str[15]; bool flag = false; while(gets(str)){ if(str[0] == '\0') {flag = true; continue;} if(!flag) Insert(str); else cout << PreCal(str) << endl; } return 0; }