#include <bits/stdc++.h>
using namespace std;
struct node {
  int l, r, q = 1e9;
  char laz = -1;
};
const int MAXN = 2e5 + 10, SZ = 110;
node vs[MAXN * 4];
set<int> S[SZ];
char a[MAXN];
int n, m, k;
void make(int v, int l, int r) {
  vs[v].l = l, vs[v].r = r;
  if (r - l == 1) {
    vs[v].laz = a[l];
    vs[v].q = 0;
    return;
  }
  int mid = (r + l) / 2;
  make(2 * v, l, mid);
  make(2 * v + 1, mid, r);
}
void add(int v, int ql, int qr, char c, int Q) {
  if (qr <= vs[v].l || vs[v].r <= ql) return;
  if (ql <= vs[v].l && vs[v].r <= qr) {
    vs[v].laz = c;
    vs[v].q = Q;
    return;
  }
  add(2 * v, ql, qr, c, Q);
  add(2 * v + 1, ql, qr, c, Q);
}
pair<int, char> get(int v, int qi) {
  int mid = (vs[v].r + vs[v].l) / 2;
  pair<int, char> res = {vs[v].q, vs[v].laz};
  if (vs[v].r - vs[v].l == 1) return res;
  if (qi < mid)
    res = min(res, get(2 * v, qi));
  else
    res = min(res, get(2 * v + 1, qi));
  return res;
}
void handle(int ind) {
  if (ind < 0 && ind + 1 < n) return;
  char f = get(1, ind).second, s = get(1, ind + 1).second;
  S[(f - 'a') * 10 + (s - 'a')].insert(ind);
}
int main() {
  cin >> n >> m >> k;
  for (int i = 0; i < n; i++) cin >> a[i];
  make(1, 0, n);
  for (int i = 0; i < n; i++) handle(i);
  for (int i = 0; i < m; i++) {
    int t, l, r;
    string s;
    char c;
    cin >> t;
    if (t == 1) {
      cin >> l >> r >> c;
      l--;
      add(1, l, r, c, -i - 1);
      for (int j = 0; j < SZ; j++)
        while (!S[j].empty()) {
          set<int>::iterator it = S[j].lower_bound(l - 1);
          if (it == S[j].end() || *it >= r) break;
          S[j].erase(it);
        }
      handle(l - 1);
      handle(r - 1);
    } else {
      cin >> s;
      int ans = n;
      for (int i = 0; i < s.size(); i++)
        for (int j = i + 1; j < s.size(); j++)
          ans -= S[(s[i] - 'a') * 10 + s[j] - 'a'].size();
      cout << ans << '\n';
    }
  }
}
