#include<bits/stdc++.h>
#define TIME (1.0* clock()/CLOCKS_PER_SEC)
#define pb push_back
#define eb emplace_back
#define id1 (id<<1)
#define id2 (id<<1)|1
#define ll long long
#define ii pair<int,int>
#define vi vector<int>
#define vii vector<pair<int,int>>
#define vl vector<long long>
#define vll vector <pair<ll,ll>>
#define li pair<long long,int>
#define vil vector <pair<int,ll>>
#define db double
#define ff first
#define ss second
#define lb lower_bound
#define ub upper_bound
#define FOR(i, a, b) for (int i = (a); i <=(b); i++)
#define F0R(i, a) FOR(i, 0, a-1)
#define ROF(i, a, b) for (int i = (b); i >= (a); i--)
#define R0F(i, a) ROF(i, 0, a-1)
#define rep(a) F0R(_, a)
#define each(a, x) for (auto &a : x)
#define ALL(x) (x).begin(),(x).end()
#define pq priority_queue <li, vector <li>, greater <li>>
using namespace std;
const int maxn=200005;
// k ≤ 10
int n, m, k;
string s;
int lz[maxn << 2];
struct Node {
int fir, las;
int f[10][10];
int len;
} t[maxn << 2];
Node merge(Node a, Node b) {
Node res;
res.fir = a.fir;
res.las = b.las;
res.len = a.len + b.len;
for(int i = 0; i < k; i++) for(int j = 0; j < k; j++)
res.f[i][j] = a.f[i][j] + b.f[i][j];
if(a.len > 0 && b.len > 0) {
res.f[a.las][b.fir]++;
}
return res;
}
void build(int id, int l, int r) {
lz[id] = -1;
if(l == r) {
int c = s[l] - 'a';
t[id].fir = t[id].las = c;
t[id].len = 1;
for(int i=0;i<k;i++) for(int j=0;j<k;j++) t[id].f[i][j]=0;
return;
}
int mid = (l + r) >> 1;
build(id1, l, mid);
build(id2, mid+1, r);
t[id] = merge(t[id1], t[id2]);
}
void push(int id, int l, int r) {
if(lz[id] != -1) {
int c = lz[id];
t[id].fir = t[id].las = c;
for(int i=0;i<k;i++) for(int j=0;j<k;j++) t[id].f[i][j]=0;
if(t[id].len > 1) t[id].f[c][c] = t[id].len - 1;
if(l != r) {
lz[id1] = c;
lz[id2] = c;
}
lz[id] = -1;
}
}
void update(int id, int l, int r, int u, int v, int c) {
push(id, l, r);
if(v < l || r < u) return;
if(u <= l && r <= v) {
lz[id] = c;
push(id, l, r);
return;
}
int mid = (l + r) >> 1;
update(id1, l, mid, u, v, c);
update(id2, mid+1, r, u, v, c);
t[id] = merge(t[id1], t[id2]);
}
int query(const string &p) {
vector<int> pos(k);
for(int i=0;i<k;i++) pos[p[i]-'a'] = i;
int res = 0;
for(int i=0;i<k;i++) for(int j=0;j<k;j++) {
int val = (pos[i] >= pos[j]) ? 1 : 0;
res += t[1].f[i][j] * val;
}
return res;
}
void solve(){
cin>>n>>m>>k;
cin>>s;
s = ' ' + s;
build(1,1,n);
while(m--) {
int type;
cin>>type;
if(type==1) {
int l,r; char x;
cin>>l>>r>>x;
update(1,1,n,l,r, x - 'a');
} else {
string p;
cin>>p;
cout<<query(p)+1<< '\n';
}
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
if(fopen("TASK.INP","r")){
freopen("TASK.INP","r",stdin);
freopen("TASK.OUT","w",stdout);
}
solve();
cerr<<"Time elapsed "<<TIME<<"s.";
return 0;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KI2RlZmluZSBUSU1FICgxLjAqIGNsb2NrKCkvQ0xPQ0tTX1BFUl9TRUMpCiNkZWZpbmUgcGIgcHVzaF9iYWNrCiNkZWZpbmUgZWIgZW1wbGFjZV9iYWNrCiNkZWZpbmUgaWQxIChpZDw8MSkKI2RlZmluZSBpZDIgKGlkPDwxKXwxCiNkZWZpbmUgbGwgbG9uZyBsb25nCiNkZWZpbmUgaWkgcGFpcjxpbnQsaW50PgojZGVmaW5lIHZpIHZlY3RvcjxpbnQ+CiNkZWZpbmUgdmlpIHZlY3RvcjxwYWlyPGludCxpbnQ+PiAKI2RlZmluZSB2bCB2ZWN0b3I8bG9uZyBsb25nPgojZGVmaW5lIHZsbCB2ZWN0b3IgPHBhaXI8bGwsbGw+PgojZGVmaW5lIGxpIHBhaXI8bG9uZyBsb25nLGludD4KI2RlZmluZSB2aWwgdmVjdG9yIDxwYWlyPGludCxsbD4+CiNkZWZpbmUgZGIgZG91YmxlCiNkZWZpbmUgZmYgZmlyc3QKI2RlZmluZSBzcyBzZWNvbmQKI2RlZmluZSBsYiBsb3dlcl9ib3VuZAojZGVmaW5lIHViIHVwcGVyX2JvdW5kCiNkZWZpbmUgRk9SKGksIGEsIGIpIGZvciAoaW50IGkgPSAoYSk7IGkgPD0oYik7IGkrKykKI2RlZmluZSBGMFIoaSwgYSkgRk9SKGksIDAsIGEtMSkKI2RlZmluZSBST0YoaSwgYSwgYikgZm9yIChpbnQgaSA9IChiKTsgaSA+PSAoYSk7IGktLSkKI2RlZmluZSBSMEYoaSwgYSkgUk9GKGksIDAsIGEtMSkKI2RlZmluZSByZXAoYSkgRjBSKF8sIGEpCiNkZWZpbmUgZWFjaChhLCB4KSBmb3IgKGF1dG8gJmEgOiB4KQojZGVmaW5lIEFMTCh4KSAoeCkuYmVnaW4oKSwoeCkuZW5kKCkKI2RlZmluZSBwcSBwcmlvcml0eV9xdWV1ZSA8bGksIHZlY3RvciA8bGk+LCBncmVhdGVyIDxsaT4+IAp1c2luZyBuYW1lc3BhY2Ugc3RkOwpjb25zdCBpbnQgbWF4bj0yMDAwMDU7Ci8vIGsg4omkIDEwCmludCBuLCBtLCBrOwpzdHJpbmcgczsKaW50IGx6W21heG4gPDwgMl07IAoKc3RydWN0IE5vZGUgewogICAgaW50IGZpciwgbGFzOwogICAgaW50IGZbMTBdWzEwXTsKICAgIGludCBsZW47Cn0gdFttYXhuIDw8IDJdOwoKTm9kZSBtZXJnZShOb2RlIGEsIE5vZGUgYikgewogICAgTm9kZSByZXM7CiAgICByZXMuZmlyID0gYS5maXI7CiAgICByZXMubGFzID0gYi5sYXM7CiAgICByZXMubGVuID0gYS5sZW4gKyBiLmxlbjsKICAgIAogICAgZm9yKGludCBpID0gMDsgaSA8IGs7IGkrKykgZm9yKGludCBqID0gMDsgaiA8IGs7IGorKykKICAgICAgICByZXMuZltpXVtqXSA9IGEuZltpXVtqXSArIGIuZltpXVtqXTsKICAgIGlmKGEubGVuID4gMCAmJiBiLmxlbiA+IDApIHsKICAgICAgICByZXMuZlthLmxhc11bYi5maXJdKys7CiAgICB9CiAgICByZXR1cm4gcmVzOwp9Cgp2b2lkIGJ1aWxkKGludCBpZCwgaW50IGwsIGludCByKSB7CiAgICBseltpZF0gPSAtMTsKICAgIGlmKGwgPT0gcikgewogICAgICAgIGludCBjID0gc1tsXSAtICdhJzsKICAgICAgICB0W2lkXS5maXIgPSB0W2lkXS5sYXMgPSBjOwogICAgICAgIHRbaWRdLmxlbiA9IDE7CiAgICAgICAgZm9yKGludCBpPTA7aTxrO2krKykgZm9yKGludCBqPTA7ajxrO2orKykgdFtpZF0uZltpXVtqXT0wOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGludCBtaWQgPSAobCArIHIpID4+IDE7CiAgICBidWlsZChpZDEsIGwsIG1pZCk7CiAgICBidWlsZChpZDIsIG1pZCsxLCByKTsKICAgIHRbaWRdID0gbWVyZ2UodFtpZDFdLCB0W2lkMl0pOwp9Cgp2b2lkIHB1c2goaW50IGlkLCBpbnQgbCwgaW50IHIpIHsKICAgIGlmKGx6W2lkXSAhPSAtMSkgewogICAgICAgIGludCBjID0gbHpbaWRdOwogICAgICAgIHRbaWRdLmZpciA9IHRbaWRdLmxhcyA9IGM7CiAgICAgICAgCiAgICAgICAgZm9yKGludCBpPTA7aTxrO2krKykgZm9yKGludCBqPTA7ajxrO2orKykgdFtpZF0uZltpXVtqXT0wOwogICAgICAgIGlmKHRbaWRdLmxlbiA+IDEpIHRbaWRdLmZbY11bY10gPSB0W2lkXS5sZW4gLSAxOwogICAgICAgIGlmKGwgIT0gcikgewogICAgICAgICAgICBseltpZDFdID0gYzsKICAgICAgICAgICAgbHpbaWQyXSA9IGM7CiAgICAgICAgfQogICAgICAgIGx6W2lkXSA9IC0xOwogICAgfQp9Cgp2b2lkIHVwZGF0ZShpbnQgaWQsIGludCBsLCBpbnQgciwgaW50IHUsIGludCB2LCBpbnQgYykgewogICAgcHVzaChpZCwgbCwgcik7CiAgICBpZih2IDwgbCB8fCByIDwgdSkgcmV0dXJuOwogICAgaWYodSA8PSBsICYmIHIgPD0gdikgewogICAgICAgIGx6W2lkXSA9IGM7CiAgICAgICAgcHVzaChpZCwgbCwgcik7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgaW50IG1pZCA9IChsICsgcikgPj4gMTsKICAgIHVwZGF0ZShpZDEsIGwsIG1pZCwgdSwgdiwgYyk7CiAgICB1cGRhdGUoaWQyLCBtaWQrMSwgciwgdSwgdiwgYyk7CiAgICB0W2lkXSA9IG1lcmdlKHRbaWQxXSwgdFtpZDJdKTsKfQoKaW50IHF1ZXJ5KGNvbnN0IHN0cmluZyAmcCkgewogICAgdmVjdG9yPGludD4gcG9zKGspOwogICAgZm9yKGludCBpPTA7aTxrO2krKykgcG9zW3BbaV0tJ2EnXSA9IGk7CiAgICBpbnQgcmVzID0gMDsKICAgIGZvcihpbnQgaT0wO2k8aztpKyspIGZvcihpbnQgaj0wO2o8aztqKyspIHsKICAgICAgICBpbnQgdmFsID0gKHBvc1tpXSA+PSBwb3Nbal0pID8gMSA6IDA7CiAgICAgICAgcmVzICs9IHRbMV0uZltpXVtqXSAqIHZhbDsKICAgIH0KICAgIHJldHVybiByZXM7Cn0KCnZvaWQgc29sdmUoKXsKICBjaW4+Pm4+Pm0+Pms7CiAgY2luPj5zOwogIHMgPSAnICcgKyBzOwogIGJ1aWxkKDEsMSxuKTsKICB3aGlsZShtLS0pIHsKICAgIGludCB0eXBlOwogICAgY2luPj50eXBlOwogICAgaWYodHlwZT09MSkgewogICAgICBpbnQgbCxyOyBjaGFyIHg7CiAgICAgIGNpbj4+bD4+cj4+eDsKICAgICAgdXBkYXRlKDEsMSxuLGwsciwgeCAtICdhJyk7CiAgICB9IGVsc2UgewogICAgICBzdHJpbmcgcDsKICAgICAgY2luPj5wOwogICAgICBjb3V0PDxxdWVyeShwKSsxPDwgJ1xuJzsKICAgIH0KICB9Cn0KCmludCBtYWluKCl7CiAgaW9zOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOwogIGNpbi50aWUoTlVMTCk7CiAgaWYoZm9wZW4oIlRBU0suSU5QIiwiciIpKXsKICAgIGZyZW9wZW4oIlRBU0suSU5QIiwiciIsc3RkaW4pOwogICAgZnJlb3BlbigiVEFTSy5PVVQiLCJ3IixzdGRvdXQpOwogIH0KICBzb2x2ZSgpOwogIGNlcnI8PCJUaW1lIGVsYXBzZWQgIjw8VElNRTw8InMuIjsKICByZXR1cm4gMDsKfQ==