模糊搜索相关, trie树的dfs+剪枝
#include <iostream> #include <cstdio> #include <cstdlib> #include <cmath> #include <queue> #include <algorithm> #include <vector> #include <cstring> #include <stack> #include <cctype> #include <utility> #include <map> #include <string> #include <climits> #include <set> #include <string> #include <sstream> #include <utility> #include <ctime> #include <bitset> //#pragma comment(linker, "/STACK:102400000,102400000") using std::priority_queue; using std::vector; using std::swap; using std::stack; using std::sort; using std::max; using std::min; using std::pair; using std::map; using std::string; using std::cin; using std::cout; using std::set; using std::queue; using std::string; using std::stringstream; using std::make_pair; using std::getline; using std::greater; using std::endl; using std::multimap; using std::deque; using std::unique; using std::lower_bound; using std::random_shuffle; using std::bitset; using std::upper_bound; using std::multiset; typedef long long LL; typedef unsigned long long ULL; typedef unsigned UN; typedef pair<int, int> PAIR; typedef multimap<int, int> MMAP; typedef LL TY; typedef long double LF; const int MAXN(1000010); const int MAXM(50010); const int MAXE(150010); const int MAXK(6); const int HSIZE(1313); const int SIGMA_SIZE(4); const int MAXH(17); const int INFI((INT_MAX-1) >> 1); const ULL BASE(31); const LL LIM(1e13); const int INV(-10000); const int MOD(31313); const double EPS(1e-7); const LF PI(acos(-1.0)); template<typename T> inline void checkmax(T &a, T b){if(b > a) a = b;} template<typename T> inline void checkmin(T &a, T b){if(b < a) a = b;} template<typename T> inline T ABS(const T &a){return a < 0? -a: a;} struct NODE { int flag[2], rec; NODE *ch[26]; } node[MAXN], *root; int size; void insert(char *S) { NODE *rt = root; for(; *S; ++S) { ++rt->rec; int id = *S-'a'; if(!rt->ch[id]) rt->ch[id] = node+size++; rt = rt->ch[id]; } ++rt->rec; } int cur; void dfs(char *S, NODE *rt, int lim) { if(rt->flag[1] == cur) return; rt->flag[0] = cur; if(*S) { int id = *S-'a'; if(rt->ch[id]) dfs(S+1, rt->ch[id], lim); if(lim) { for(int i = 0; i < 26; ++i) if(rt->ch[i]) { dfs(S+1, rt->ch[i], lim-1); dfs(S, rt->ch[i], lim-1); } dfs(S+1, rt, lim-1); } } else rt->flag[1] = cur; } int ans = 0; void dfsans(NODE *rt) { if(rt->flag[0] != cur) return; if(rt->flag[1] == cur) { ans += rt->rec; return; } for(int i = 0; i < 26; ++i) if(rt->ch[i]) dfsans(rt->ch[i]); } char str[20]; int main() { int n; scanf("%d", &n); root = node+size++; for(int i = 0; i < n; ++i) { scanf("%s", str); insert(str); } int m, lim; scanf("%d", &m); for(cur = 1; cur <= m; ++cur) { scanf("%s%d", str, &lim); dfs(str, root, lim); ans = 0; dfsans(root); printf("%d\n", ans); } return 0; }