1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <vector> 6 using namespace std; 7 const int M = 20071027; 8 const int maxn = 300000 + 10; 9 const int maxnode = 400000+10; 10 const int _size = 26; 11 12 struct Trie { 13 int ch[maxnode][_size]; 14 int val[maxnode]; 15 int sz; 16 Trie() { 17 sz = 1; 18 memset(ch[0], 0, sizeof (ch[0])); 19 } 20 int idx(int c) {return c - 'a';} 21 22 void insert(char *s, int v) { //插入字符串s和权值v 23 int u = 0, n = strlen(s); 24 for(int i = 0; i < n; i++) { 25 int c = idx(s[i]); 26 if(!ch[u][c]) { 27 memset(ch[sz], 0, sizeof (ch[sz])); 28 val[sz] = 0; 29 ch[u][c] = sz++; 30 } 31 u = ch[u][c]; 32 } 33 val[u] = v; 34 } 35 void find_prefixes(const char *s, int len, vector<int>& ans) { //寻找字符串s的前缀 36 int u = 0; 37 for(int i = 0; i < len; i++) { 38 if(s[i] == '