#include <bits/stdc++.h> // NeOWami
using namespace std;
#define ft first
#define sc second
#define int long long
const int N = 1e6 + 5;
int q, ans[N];
struct query {
int t, id;
string s;
} Q[N];
//Chep Code Aho
struct AhoCorasick {
static const int SIGMA = 2;
int base;
struct Node {
array<int, SIGMA> next{};
int link = 0;
int out = 0;
Node() { next.fill(-1); }
};
vector<Node> t;
vector<int> term_node, bfs_order;
AhoCorasick(int baseChar = 'a') : base(baseChar) {
t.emplace_back();
t[0].link = 0;
}
int add(const string& s) {
int v = 0;
for (char ch : s) {
int c = ch - base;
if (c < 0 || c >= SIGMA) {
continue;
}
if (t[v].next[c] == -1) {
t[v].next[c] = (int)t.size();
t.emplace_back();
}
v = t[v].next[c];
}
t[v].out += 1;
term_node.push_back(v);
return (int)term_node.size() - 1;
}
void build() {
queue<int> q;
for (int c = 0; c < SIGMA; ++c) {
int u = t[0].next[c];
if (u != -1) {
t[u].link = 0;
q.push(u);
} else {
t[0].next[c] = 0;
}
}
bfs_order.clear();
while (!q.empty()) {
int v = q.front(); q.pop();
bfs_order.push_back(v);
int link = t[v].link;
t[v].out += t[link].out;
for (int c = 0; c < SIGMA; ++c) {
int u = t[v].next[c];
if (u != -1) {
t[u].link = t[link].next[c];
q.push(u);
} else {
t[v].next[c] = t[link].next[c];
}
}
}
}
long long count_total(const string& s) const {
long long ans = 0;
int v = 0;
for (char ch : s) {
int c = ch - base;
if (c < 0 || c >= SIGMA) { v = 0; continue; }
v = t[v].next[c];
ans += t[v].out;
}
return ans;
}
};
void DnC(int l, int r){
if(l >= r) return;
int mid = l + r >> 1;
AhoCorasick ac('0');
vector<int> updates, queries;
for(int i = l; i <= mid; ++i){
if(Q[i].t == 0) ac.add(Q[i].s);
}
ac.build();
for(int i = mid + 1; i <= r; ++i){
if(Q[i].t == 1) ans[i] += ac.count_total(Q[i].s);
}
DnC(l, mid);
DnC(mid + 1, r);
}
signed main() {
cin.tie(NULL)->sync_with_stdio(false); cout.tie(NULL);
if(ifstream("VIRUS.inp")) {
freopen("VIRUS.inp", "r", stdin);
freopen("VIRUS.out", "w", stdout);
}
cin >> q;
for (int i = 1; i <= q; i++) {
cin >> Q[i].t >> Q[i].s;
}
DnC(1, q);
for (int i = 1; i <= q; i++) if (Q[i].t == 1) cout << ans[i] << '\n';
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+IC8vIE5lT1dhbWkKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCiNkZWZpbmUgZnQgZmlyc3QKI2RlZmluZSBzYyBzZWNvbmQKI2RlZmluZSBpbnQgbG9uZyBsb25nCgpjb25zdCBpbnQgTiA9IDFlNiArIDU7CmludCBxLCBhbnNbTl07CnN0cnVjdCBxdWVyeSB7CiAgICBpbnQgdCwgaWQ7CiAgICBzdHJpbmcgczsKfSBRW05dOwoKLy9DaGVwIENvZGUgQWhvCnN0cnVjdCBBaG9Db3Jhc2ljayB7CiAgICBzdGF0aWMgY29uc3QgaW50IFNJR01BID0gMjsKICAgIGludCBiYXNlOwogICAgc3RydWN0IE5vZGUgewogICAgICAgIGFycmF5PGludCwgU0lHTUE+IG5leHR7fTsKICAgICAgICBpbnQgbGluayA9IDA7CiAgICAgICAgaW50IG91dCA9IDA7CiAgICAgICAgTm9kZSgpIHsgbmV4dC5maWxsKC0xKTsgfQogICAgfTsKCiAgICB2ZWN0b3I8Tm9kZT4gdDsKICAgIHZlY3RvcjxpbnQ+IHRlcm1fbm9kZSwgYmZzX29yZGVyOwoKICAgIEFob0NvcmFzaWNrKGludCBiYXNlQ2hhciA9ICdhJykgOiBiYXNlKGJhc2VDaGFyKSB7CiAgICAgICAgdC5lbXBsYWNlX2JhY2soKTsKICAgICAgICB0WzBdLmxpbmsgPSAwOwogICAgfQoKICAgIGludCBhZGQoY29uc3Qgc3RyaW5nJiBzKSB7CiAgICAgICAgaW50IHYgPSAwOwogICAgICAgIGZvciAoY2hhciBjaCA6IHMpIHsKICAgICAgICAgICAgaW50IGMgPSBjaCAtIGJhc2U7CiAgICAgICAgICAgIGlmIChjIDwgMCB8fCBjID49IFNJR01BKSB7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodFt2XS5uZXh0W2NdID09IC0xKSB7CiAgICAgICAgICAgICAgICB0W3ZdLm5leHRbY10gPSAoaW50KXQuc2l6ZSgpOwogICAgICAgICAgICAgICAgdC5lbXBsYWNlX2JhY2soKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2ID0gdFt2XS5uZXh0W2NdOwogICAgICAgIH0KICAgICAgICB0W3ZdLm91dCArPSAxOwogICAgICAgIHRlcm1fbm9kZS5wdXNoX2JhY2sodik7CiAgICAgICAgcmV0dXJuIChpbnQpdGVybV9ub2RlLnNpemUoKSAtIDE7CiAgICB9CgogICAgdm9pZCBidWlsZCgpIHsKICAgICAgICBxdWV1ZTxpbnQ+IHE7CiAgICAgICAgZm9yIChpbnQgYyA9IDA7IGMgPCBTSUdNQTsgKytjKSB7CiAgICAgICAgICAgIGludCB1ID0gdFswXS5uZXh0W2NdOwogICAgICAgICAgICBpZiAodSAhPSAtMSkgewogICAgICAgICAgICAgICAgdFt1XS5saW5rID0gMDsKICAgICAgICAgICAgICAgIHEucHVzaCh1KTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHRbMF0ubmV4dFtjXSA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgYmZzX29yZGVyLmNsZWFyKCk7CiAgICAgICAgd2hpbGUgKCFxLmVtcHR5KCkpIHsKICAgICAgICAgICAgaW50IHYgPSBxLmZyb250KCk7IHEucG9wKCk7CiAgICAgICAgICAgIGJmc19vcmRlci5wdXNoX2JhY2sodik7CiAgICAgICAgICAgIGludCBsaW5rID0gdFt2XS5saW5rOwogICAgICAgICAgICB0W3ZdLm91dCArPSB0W2xpbmtdLm91dDsgCiAgICAgICAgICAgIGZvciAoaW50IGMgPSAwOyBjIDwgU0lHTUE7ICsrYykgewogICAgICAgICAgICAgICAgaW50IHUgPSB0W3ZdLm5leHRbY107CiAgICAgICAgICAgICAgICBpZiAodSAhPSAtMSkgewogICAgICAgICAgICAgICAgICAgIHRbdV0ubGluayA9IHRbbGlua10ubmV4dFtjXTsKICAgICAgICAgICAgICAgICAgICBxLnB1c2godSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHRbdl0ubmV4dFtjXSA9IHRbbGlua10ubmV4dFtjXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBsb25nIGxvbmcgY291bnRfdG90YWwoY29uc3Qgc3RyaW5nJiBzKSBjb25zdCB7CiAgICAgICAgbG9uZyBsb25nIGFucyA9IDA7CiAgICAgICAgaW50IHYgPSAwOwogICAgICAgIGZvciAoY2hhciBjaCA6IHMpIHsKICAgICAgICAgICAgaW50IGMgPSBjaCAtIGJhc2U7CiAgICAgICAgICAgIGlmIChjIDwgMCB8fCBjID49IFNJR01BKSB7IHYgPSAwOyBjb250aW51ZTsgfQogICAgICAgICAgICB2ID0gdFt2XS5uZXh0W2NdOwogICAgICAgICAgICBhbnMgKz0gdFt2XS5vdXQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiBhbnM7CiAgICB9Cn07CnZvaWQgRG5DKGludCBsLCBpbnQgcil7CiAgICBpZihsID49IHIpIHJldHVybjsKICAgIGludCBtaWQgPSBsICsgciA+PiAxOwogICAgQWhvQ29yYXNpY2sgYWMoJzAnKTsKICAgIHZlY3RvcjxpbnQ+IHVwZGF0ZXMsIHF1ZXJpZXM7CiAgICBmb3IoaW50IGkgPSBsOyBpIDw9IG1pZDsgKytpKXsKICAgICAgICBpZihRW2ldLnQgPT0gMCkgYWMuYWRkKFFbaV0ucyk7CiAgICB9CiAgICBhYy5idWlsZCgpOwogICAgZm9yKGludCBpID0gbWlkICsgMTsgaSA8PSByOyArK2kpewogICAgICAgIGlmKFFbaV0udCA9PSAxKSBhbnNbaV0gKz0gYWMuY291bnRfdG90YWwoUVtpXS5zKTsKICAgIH0KICAgIERuQyhsLCBtaWQpOwogICAgRG5DKG1pZCArIDEsIHIpOwp9CgpzaWduZWQgbWFpbigpIHsKICAgIGNpbi50aWUoTlVMTCktPnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7IGNvdXQudGllKE5VTEwpOwogICAgaWYoaWZzdHJlYW0oIlZJUlVTLmlucCIpKSB7CiAgICAgICAgZnJlb3BlbigiVklSVVMuaW5wIiwgInIiLCBzdGRpbik7CiAgICAgICAgZnJlb3BlbigiVklSVVMub3V0IiwgInciLCBzdGRvdXQpOwogICAgfQogICAgY2luID4+IHE7CiAgICBmb3IgKGludCBpID0gMTsgaSA8PSBxOyBpKyspIHsKICAgICAgICBjaW4gPj4gUVtpXS50ID4+IFFbaV0uczsKICAgIH0KCiAgICBEbkMoMSwgcSk7CiAgICBmb3IgKGludCBpID0gMTsgaSA8PSBxOyBpKyspIGlmIChRW2ldLnQgPT0gMSkgY291dCA8PCBhbnNbaV0gPDwgJ1xuJzsKICAgIHJldHVybiAwOwp9