G

Untitled

public
Guest Jul 31, 2025 Never 15
Clone
C++ paste1.cpp 135 lines (121 loc) | 2.95 KB
1
#include <bits/stdc++.h>
2
3
using namespace std;
4
5
typedef long long ll;
6
typedef long double ld;
7
typedef pair<int, int> pii;
8
typedef pair<ll, ll> pll;
9
typedef vector<int> vi;
10
11
#define fi first
12
#define se second
13
#define pp push_back
14
#define all(x) (x).begin(), (x).end()
15
#define Ones(n) __builtin_popcount(n)
16
#define endl '\n'
17
#define fill(arrr,xx) memset(arrr,xx,sizeof arrr)
18
#define rep(aa, bb, cc) for(int aa = bb; aa < cc;aa++)
19
#define PI acos(-1)
20
//#define int long long
21
22
void Gamal() {
23
ios_base::sync_with_stdio(false);
24
cin.tie(nullptr);
25
cout.tie(nullptr);
26
#ifdef Clion
27
freopen("input.txt", "r", stdin), freopen("output.txt", "w", stdout);
28
#endif
29
}
30
31
int dx[] = {+0, +0, -1, +1, +1, +1, -1, -1};
32
int dy[] = {-1, +1, +0, +0, +1, -1, +1, -1};
33
34
const double EPS = 1e-9;
35
const ll N = 1e6 + 5, INF = INT_MAX, MOD = 1e9 + 7, OO = 0X3F3F3F3F3F3F3F3F, LOG = 20;
36
37
int trie[N][26],cur;
38
set<int>adj[N],here[N];
39
40
void insert(string &s,int i){
41
int node = 0;
42
for(auto c:s){
43
if(trie[node][c - 'a'] == -1){
44
trie[node][c - 'a'] = ++cur;
45
}
46
node = trie[node][c - 'a'];
47
adj[node].insert(i);
48
}
49
here[node].insert(i);
50
}
51
52
void erase(string &s,int i){
53
int node = 0;
54
for(auto c:s){
55
node = trie[node][c - 'a'];
56
adj[node].erase(i);
57
}
58
here[node].erase(i);
59
}
60
61
char query1(int l,int r,string &s){
62
int node = 0;
63
for(auto c:s){
64
if(trie[node][c - 'a'] == -1){
65
return 'N';
66
}
67
node = trie[node][c - 'a'];
68
if(here[node].size()){
69
auto itr = here[node].lower_bound(l);
70
if(itr != here[node].end() && *itr <= r){
71
return 'Y';
72
}
73
}
74
}
75
return 'N';
76
}
77
78
char query2(int l,int r,string &s){
79
int node = 0;
80
for(auto c:s){
81
if(trie[node][c - 'a'] == -1){
82
return 'N';
83
}
84
node = trie[node][c - 'a'];
85
}
86
auto itr = adj[node].lower_bound(l);
87
if(itr != adj[node].end() && *itr <= r){
88
return 'Y';
89
}
90
return 'N';
91
}
92
93
void solve() {
94
int n;cin >> n;
95
fill(trie,-1);
96
vector<string>v(n);
97
for (int i = 0; i < n; ++i) {
98
cin >> v[i];
99
insert(v[i],i);
100
}
101
int q;cin >> q;
102
while (q--){
103
int t;cin >> t;
104
if(t == 1){
105
int i;cin >> i;
106
i--;
107
string s;cin >> s;
108
erase(v[i],i);
109
v[i] = s;
110
insert(v[i],i);
111
}
112
else if(t == 2){
113
int l,r;cin >> l >> r;
114
l--,r--;
115
string s;cin >> s;
116
cout << query1(l,r,s) << endl;
117
}
118
else{
119
int l,r;cin >> l >> r;
120
l--,r--;
121
string s;cin >> s;
122
cout << query2(l,r,s) << endl;
123
}
124
}
125
}
126
127
128
signed main() {
129
Gamal();
130
int t = 1;
131
// cin >> t;
132
while (t--) {
133
solve();
134
}
135
}