HDU1251——trie模板——统计难题
http://acm.hdu.edu.cn/showproblem.php?pid=1251
/* 模板题,c表示最长后缀串的编号,如果后面加入的与前面的字符一直相同,那么不会产生新的 推荐 http://www.cnblogs.com/yym2013/p/3780621.html http://blog.csdn.net/v_july_v/article/details/6897097 */ /************************************************ * Author :Powatr * Created Time :2015-8-14 16:26:57 * File Name :hdu1251.cpp ************************************************/ #include <cstdio> #include <algorithm> #include <iostream> #include <sstream> #include <cstring> #include <cmath> #include <string> #include <vector> #include <queue> #include <deque> #include <stack> #include <list> #include <map> #include <set> #include <bitset> #include <cstdlib> #include <ctime> using namespace std; #define lson l, mid, rt << 1 #define rson mid + 1, r, rt << 1 | 1 typedef long long ll; const int MAXN = 1e6 + 10; const int INF = 0x3f3f3f3f; const int MOD = 1e9 + 7; int trie[MAXN][26]; int num[MAXN]; char s[11]; int len; int pos; void insert(char s[]) { int c = 0; len = strlen(s); for(int i = 0; i < len; i++){ int m = s[i] - 'a'; if(!trie[c][m]) trie[c][m] = pos++; c = trie[c][m]; num[c]++; } } int find(char s[]) { int c = 0; len = strlen(s); for(int i = 0; i < len; i++){ int m = s[i] - 'a'; if(!trie[c][m]) return 0; c = trie[c][m]; } return num[c]; } int main() { pos = 1; while(gets(s)){ if(s[0] == '\0') break; insert(s); } while(gets(s)) printf("%d\n", find(s)); return 0; }