Untitled
public
Jul 31, 2025
Never
15
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 }