/* -*- coding: utf-8 -*- * * 1725.cc: No.1725 [Cherry 3rd Tune D] 無言の言葉 - yukicoder */ #include #include #include using namespace std; /* constant */ const int MAX_N = 100000; const int MAX_K = 30; const int MAX_R = 1000000000; /* typedef */ struct Vec { int vs[26]; Vec(): vs() {} int &operator[](int i) { return vs[i]; } Vec operator+(const Vec &e) const { Vec r; for (int i = 0; i < 26; i++) r.vs[i] = vs[i] + e.vs[i]; return r; } Vec operator-(const Vec &e) const { Vec r; for (int i = 0; i < 26; i++) r.vs[i] = vs[i] - e.vs[i]; return r; } }; /* global variables */ char sx[MAX_N + 4], sy[MAX_N + 4]; Vec xvs[MAX_N + 1], yvs[MAX_N + 1], fvs[MAX_K]; int xn, yn, fns[MAX_K]; /* subroutines */ void s2vecs(int n, char s[], Vec vs[]) { for (int i = 0; i < n; i++) { vs[i + 1] = vs[i]; vs[i + 1][s[i] - 'a']++; } } int rec(int k, int r, int ci) { if (k <= 0) return xvs[min(xn, r)][ci]; k--; if (r <= fns[k]) return rec(k, r, ci); if (r <= fns[k] + yn) return fvs[k][ci] + yvs[r - fns[k]][ci]; r -= fns[k] + yn; return fvs[k + 1][ci] - rec(k, max(0, fns[k] - r), ci); } /* main */ int main() { int qn; scanf("%s%s%d", sx, sy, &qn); xn = strlen(sx), yn = strlen(sy); s2vecs(xn, sx, xvs); s2vecs(yn, sy, yvs); fns[0] = xn; fvs[0] = xvs[xn]; int k = 0; while (fns[k] < MAX_R) { fns[k + 1] = fns[k] * 2 + yn; fvs[k + 1] = fvs[k] + yvs[yn] + fvs[k]; k++; } //printf("k=%d ", k); //for (int i = 0; i <= k; i++) printf("%d ", fns[i]); putchar('\n'); while (qn--) { int l, r; char sc[4]; scanf("%d%d%s", &l, &r, sc); l--; int ci = sc[0] - 'a'; int d = rec(k, r, ci) - rec(k, l, ci); printf("%d\n", d); } return 0; }