哈希+可持久化线段树。

  不需要统计区间和,只需要单点查询即可,主要是哈希难搞。

 

  别忘了继承上一个点的信息。。。

 

  sb哈希 : 直接把每个数字连在一起,中间用 '#' 或 '$' 链接,丢在map里,10920ms。

 1 #include <bits/stdc++.h>
 2 #define rep(i, a, b) for (int i = a; i <= b; i++)
 3 #define REP(i, a, b) for (int i = a; i < b; i++)
 4 #define drep(i, a, b) for (int i = a; i >= b; i--)
 5 #define pb push_back
 6 #define mp make_pair
 7 #define xx first
 8 #define yy second
 9 using namespace std;
10 typedef long long i64;
11 typedef pair<int, int> pii;
12 const int inf = ~0U >> 1;
13 const i64 INF = ~0ULL >> 1;
14 //*****************************
15  
16 const int maxn = 100005;
17 const int maxm = 36 * maxn;
18  
19 int read() {
20     int l = 1, s = 0;
21     char ch = getchar();
22     while (ch < '0' || ch > '9') { if (ch == '-') l = -1; ch = getchar(); }
23     while (ch >= '0' && ch <= '9') { s = (s << 1) + (s << 3) + ch - '0'; ch = getchar(); }
24     return l * s;
25 }
26  
27 int hsh_cnt;
28 map<string, int> M;
29 string fuckit(int s, int k, char a[][15]) {
30     string str;
31     while (k--) {
32         for (int i = 0; a[s][i]; i++) str += a[s][i];
33         s++;
34         str += '#';
35     }
36     return str;
37 }
38  
39 int nn;
40 char a[maxn][15];
41  
42 int Sum[maxm], root[maxm], Lson[maxm], Rson[maxm], ndtot;
43 void build(int x, int &y, int l, int r, int v) {
44     y = ++ndtot;
45     if (l == r) {
46         Sum[y] = Sum[x] + 1;
47         return;
48     }
49     int mid = l + r >> 1;
50     if (v <= mid) {
51         Rson[y] = Rson[x];
52         build(Lson[x], Lson[y], l, mid, v);
53     }
54     else {
55         Lson[y] = Lson[x];
56         build(Rson[x], Rson[y], mid + 1, r, v);
57     }
58 }
59  
60 bool query(int x, int y, int l, int r, int v) {
61     if (l == r) {
62         return Sum[y] - Sum[x] > 0;
63     }
64     int mid = l + r >> 1;
65     if (v <= mid) return query(Lson[x], Lson[y], l, mid, v);
66     else return query(Rson[x], Rson[y], mid + 1, r, v);
67 }
68  
69 char b[maxn][15];
70 int main() {
71     int n, m, k;
72     n = read(), m = read(), k = read();
73     nn = n;
74     rep(i, 1, n) scanf("%s", a[i]);
75  
76     rep(i, 1, n - k + 1) {
77         string t = fuckit(i, k, a);
78         if (!M[t]) M[t] = ++hsh_cnt;
79         build(root[i - 1], root[i], 1, nn, M[t]);
80     }
81     while (m--) {
82         int l, r; l = read(), r = read(); rep(i, 1, k) scanf("%s", b[i]);
83         r -= k - 1;
84         string t = fuckit(1, k, b);
85         if (!M[t]) puts("Yes");
86         else if (query(root[l - 1], root[r], 1, nn, M[t])) puts("No");
87         else puts("Yes");
88     }
89 }
View Code

相关文章: