#include <bits/stdc++.h>
#pragma GCC optimize("O2")
using namespace std;
const int maxn = 1000 * 100 + 5;
const int maxk = 12;
const long long inf = 9223372036854775807;
const long long mod = 1e9 + 7;
int n, m, k, cnt[500][500], ans;
string s, p;
set<int> segs;
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  ;
  cin >> n >> m >> k >> s;
  s += '*';
  segs.insert(n);
  for (int i = 0; i < n; i++) {
    if (s[i] != s[i + 1]) {
      segs.insert(i);
      cnt[s[i]][s[i + 1]] += 1;
    }
  }
  int t, l, r;
  char c, d;
  for (int i = 1; i <= m; i++) {
    cin >> t;
    if (t == 1) {
      cin >> l >> r >> c;
      l--;
      r--;
      d = s[*segs.lower_bound(l - 1)];
      auto it = segs.lower_bound(l - 1);
      while (*it <= r) {
        cnt[s[*segs.lower_bound(*it)]][s[*segs.lower_bound((*it) + 1)]]--;
        it = segs.erase(it);
      }
      if (l > 0) {
        segs.insert(l - 1);
        s[l - 1] = d;
      }
      segs.insert(r);
      s[r] = c;
      cnt[s[*segs.lower_bound(l - 1)]][s[*segs.lower_bound(l)]]++;
      cnt[s[*segs.lower_bound(r)]][s[*segs.lower_bound(r + 1)]]++;
    } else {
      cin >> p;
      ans = n;
      for (int i = 0; i < k; i++) {
        for (int j = i + 1; j < k; j++) ans -= cnt[p[i]][p[j]];
      }
      cout << ans << endl;
    }
  }
}
