#include using namespace std; typedef signed long long ll; #define _P(...) (void)printf(__VA_ARGS__) #define FOR(x,to) for(x=0;x<(to);x++) #define FORR(x,arr) for(auto& x:arr) #define FORR2(x,y,arr) for(auto& [x,y]:arr) #define ALL(a) (a.begin()),(a.end()) #define ZERO(a) memset(a,0,sizeof(a)) #define MINUS(a) memset(a,0xff,sizeof(a)) template bool chmax(T &a, const T &b) { if(a bool chmin(T &a, const T &b) { if(a>b){a=b;return 1;}return 0;} //------------------------------------------------------- using VT = string; ll modpow(ll a, ll n,ll mo) { ll r=1;a%=mo; while(n) r=r*((n%2)?a:1)%mo,a=a*a%mo,n>>=1; return r; } struct RollingHash { static const ll mo0=1000000021,mo1=1000000009; static ll mul0,mul1; static const ll add0=1000010007, add1=1003333331; static vector pmo[2]; VT s; int l; vector hash_[2]; void init(VT s) { this->s=s; l=s.size(); int i,j; hash_[0]=hash_[1]=vector(1,0); if(mul0==0) mul0=10009+(((ll)&mul0+time(NULL))>>5)%1259,mul1=10007+(time(NULL)+((ll)&mul1)>>5)%2257; if(pmo[0].empty()) pmo[0].push_back(1),pmo[1].push_back(1); FOR(i,l) hash_[0].push_back((hash_[0].back()*mul0+add0+s[i])%mo0); FOR(i,l) hash_[1].push_back((hash_[1].back()*mul1+add1+s[i])%mo1); } /*以下ll版*/ ll hash(int l,int r) { // s[l..r] if(l>r) return 0; while(pmo[0].size()>32,Lb=(L<<32)>>32,Ra=R>>32,Rb=(R<<32)>>32; return (((Ra + La*pmo[0][RL])%mo0)<<32)|((Rb + Lb*pmo[1][RL])%mo1); } static ll truncate(ll L ,ll R,int RL) { // hash(L-R) RL=len-of-R ll La=L>>32,Lb=(L<<32)>>32,Ra=R>>32,Rb=(R<<32)>>32; return ((((La+mo0-Ra)*modpow(pmo[0][RL],mo0-2,mo0))%mo0)<<32)|(((Lb+mo1-Rb)*modpow(pmo[1][RL],mo1-2,mo1)%mo1)); } }; vector RollingHash::pmo[2]; ll RollingHash::mul0,RollingHash::mul1; RollingHash rh; int N,Q; map V[202020]; void solve() { int i,j,k,l,r,x,y; string s; cin>>N; FOR(i,N) { cin>>s; rh.init(s); FOR(j,s.size()+1) { V[j][rh.hash(0,j-1)]++; } } string S; cin>>Q; ll cur=0; while(Q--) { cin>>i; if(i==1) { cin>>s; auto p=rh.hash(s); cur=rh.concat(cur,p,1); S+=s; } else if(i==2) { auto p=rh.hash(S.substr(S.size()-1)); cur=rh.truncate(cur,p,1); S.pop_back(); } else { cout<