由於題目要求的是必需要所有擁有,那麼天生就有一種與的性質,而後就會想出一種暴力作法:ios
對於每個標籤,用一個bitset存儲哪些文件有它數組
而後查詢就是把全部的標籤的bitset取個and就是答案集合數據結構
而後就過了oop
#include <map> #include <set> #include <ctime> #include <queue> #include <stack> #include <cmath> #include <vector> #include <bitset> #include <cstdio> #include <cctype> #include <string> #include <numeric> #include <cstring> #include <cassert> #include <climits> #include <cstdlib> #include <iostream> #include <algorithm> #include <functional> using namespace std ; //#define int long long #define rep(i, a, b) for (int i = (a); i <= (b); i++) #define per(i, a, b) for (int i = (a); i >= (b); i--) #define loop(s, v, it) for (s::iterator it = v.begin(); it != v.end(); it++) #define cont(i, x) for (int i = head[x]; i; i = e[i].nxt) #define clr(a) memset(a, 0, sizeof(a)) #define ass(a, sum) memset(a, sum, sizeof(a)) #define lowbit(x) (x & -x) #define all(x) x.begin(), x.end() #define ub upper_bound #define lb lower_bound #define pq priority_queue #define pb push_back #define fi first #define se second #define iv inline void #define enter cout << endl #define siz(x) ((int)x.size()) #define file(x) freopen(#x".in", "r", stdin),freopen(#x".out", "w", stdout) typedef long long ll ; typedef unsigned long long ull ; typedef pair <int, int> pii ; typedef vector <int> vi ; typedef vector <pii> vii ; typedef queue <int> qi ; typedef queue <pii> qii ; typedef set <int> si ; typedef map <int, int> mii ; typedef map <string, int> msi ; const int N = 100010 ; const int INF = 0x3f3f3f3f ; const int iinf = 1 << 30 ; const ll linf = 2e18 ; const int MOD = 1000000007 ; const double eps = 1e-7 ; void print(int x) { cout << x << endl ; exit(0) ; } void PRINT(string x) { cout << x << endl ; exit(0) ; } void douout(double x){ printf("%lf\n", x + 0.0000000001) ; } template <class T> void chmin(T &a, T b) { if (a > b) a = b ; } template <class T> void chmax(T &a, T b) { if (a < b) a = b ; } template <class T> void upd(T &a, T b) { (a += b) %= MOD ; } template <class T> void mul(T &a, T b) { a = 1ll * a * b % MOD ; } string sta ; map <string, bitset <1024> > mp ; map <string, bitset <1024> >::iterator it ; bitset <1024> mask ; char s[N] ; ll sz[N] ; int n, m ; signed main() { while (scanf("%d", &n) != EOF) { mp.clear() ; rep(i, 1, n) { scanf("%s%lld", s, &sz[i - 1]) ; sta = "" ; int len = strlen(s) ; rep(j, 0, len - 1) { if (s[j] == '[') { sta = "" ; } else if (s[j] == ']') { // cout << sta << endl ; mp[sta].set(i - 1) ; } else { sta += s[j] ; } } } scanf("%d", &m) ; rep(i, 1, m) { scanf("%s", s) ; int len = strlen(s) ; mask.reset() ; rep(j, 0, n - 1) mask.set(j) ; // full sta = "" ; rep(j, 0, len - 1) { if (s[j] == '[') { sta = "" ; } else if (s[j] == ']') { it = mp.find(sta) ; // cout << " * " << sta << endl ; if (it == mp.end()) { mask.reset() ; break ; } else { mask &= it->se ; } } else { sta += s[j] ; } } ll ans = 0 ; rep(j, 0, n - 1) if (mask[j]) ans += sz[j] ; printf("%lld\n", ans) ; } } return 0 ; } /* 寫代碼時請注意: 1.ll?數組大小,邊界?數據範圍? 2.精度? 3.特判? 4.至少作一些 思考提醒: 1.最大值最小->二分? 2.能夠貪心麼?不行dp能夠麼 3.能夠優化麼 4.維護區間用什麼數據結構? 5.統計方案是用dp?模了麼? 6.逆向思惟?(正難則反) */