#include <bits/stdc++.h>
#define up(i,a,b) for (int i = (int)a; i <= (int)b; i++)
#define pii pair<int, int>
#define f first
#define s second
#define all(x) x.begin(), x.end()
using namespace std;
const int maxn = 4e5 + 10;
const int maxq = 5e5 + 10;
const int LOG = log2(maxn)+2;
int n;
pair<pii, int> L[maxn]; //Lexicography order: of string at position have rank i -> start at position L[i].second
int R[LOG][maxn]; //Ranking of string start at position i, have length of 2^log -> have rank R[log][i]
int SA[maxn];
void build_SA(const string& s){
up(i,1,n) R[0][i] = s[i];
for (int POW = 1; (1 << (POW-1)) <= n; POW++){
up(i,1,n){
L[i].f.f = R[POW-1][i];
int k = i + (1 << (POW-1));
if (k <= n) L[i].f.s = R[POW-1][k];
else L[i].f.s = -1;
L[i].s = i;
}
sort(L+1, L+n+1);
int cnt = 0;
up(i,1,n){
if (L[i].f == L[i-1].f) R[POW][L[i].s] = R[POW][L[i-1].s];
else R[POW][L[i].s] = ++cnt;
}
}
up(i,1,n) SA[i] = L[i].s;
}
int LCP[maxn];
int pos[maxn];
void Kasai(const int SA[], const string& s){
up(i,1,n) pos[SA[i]] = i;
int k = 0;
up(i,1,n){
int& cur = pos[i];
int j = SA[cur-1];
//if suffix pair at position (i, j), have rank (cur, cur-1) and LCP equal to k
//then suffix pair at position (i+1, j'), have rank(cur', cur'-1) should have LCP at least k-1, and at most...
//find at at most on this line :)
while (i+k <= n && j+k <= n && s[i+k] == s[j+k]) ++k;
LCP[cur] = k;
if (k) --k;
}
}
int sp[LOG][maxn];
int logg[maxn];
void build_sparse(){
up(i,1,n) sp[0][i] = LCP[i];
up(i,2,n) logg[i] = logg[(i >> 1)] + 1;
for (int i = 1; (1 << i) <= n; i++){
for (int j = 1; j + (1 << i) - 1 <= n; j++){
sp[i][j] = min(sp[i-1][j], sp[i-1][j + (1 << (i-1))]);
}
}
}
int RMQ(const int& l, const int& r){
int k = logg[r - l + 1];
return min(sp[k][l], sp[k][r - (1 << k) + 1]);
}
int get_left(int u, const int& need){
int l = 0;
int r = u;
while (r - l > 1){
int mid = (l+r) >> 1;
if (RMQ(mid, u) >= need) r = mid;
else l = mid;
}
if (LCP[r] >= need) return r-1;
return r;
} // Find from [1 -> u]
int get_right(int u, const int& need){
++u;
int l = u;
int r = n+1;
while (r - l > 1){
int mid = (l+r) >> 1;
if (RMQ(u, mid) >= need) l = mid;
else r = mid;
}
if (LCP[l] >= need) return l;
return l-1;
} // Find from [u+1 -> n]
int BIT[maxn];
void update(int x, const int val){
while (x <= n){
BIT[x] += val;
x += (x & (-x));
}
}
int get(int x){
int res = 0;
while (x){
res += BIT[x];
x -= (x & (-x));
}
return res;
}
struct event{
int L,R,id,SIGN;
event(int L, int R, int id, int SIGN):
L(L), R(R), id(id), SIGN(SIGN)
{}
};
vector<event> E[maxn];
int ans[maxq];
void solve(){
up(i,1,n){
update(SA[i], 1);
for (auto e : E[i]){
int L = e.L;
int R = e.R;
int id = e.id;
int SIGN = e.SIGN;
ans[id] += SIGN * (get(R) - get(L-1));
}
}
}
signed main(){
ios_base::sync_with_stdio(false);
cin.tie(0);
#define Task "A"
if (fopen(Task".inp", "r")){
freopen(Task".inp", "r", stdin);
freopen(Task".out", "w", stdout);
}
string s,t;
cin >> s >> t;
int SSIZE = s.size();
string g = "@" + s + t;
n = g.size() - 1;
build_SA(g);
Kasai(SA, g);
build_sparse();
int q;
cin >> q;
up(i,1,q){
int sl, sr, tl, tr;
cin >> sl >> sr >> tl >> tr;
int slen = sr - sl + 1;
int L = get_left(pos[sl], slen);
int R = get_right(pos[sl], slen);
int A = tl + SSIZE;
int B = tr + SSIZE - slen + 1;
if (B < A || R < L) continue;
E[L-1].emplace_back(event(A, B, i, -1));
E[R].emplace_back(event(A, B, i, 1));
}
solve();
up(i,1,q) cout << ans[i] << "\n";
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNkZWZpbmUgdXAoaSxhLGIpIGZvciAoaW50IGkgPSAoaW50KWE7IGkgPD0gKGludCliOyBpKyspCiNkZWZpbmUgcGlpIHBhaXI8aW50LCBpbnQ+CiNkZWZpbmUgZiBmaXJzdAojZGVmaW5lIHMgc2Vjb25kCiNkZWZpbmUgYWxsKHgpIHguYmVnaW4oKSwgeC5lbmQoKQp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY29uc3QgaW50IG1heG4gPSA0ZTUgKyAxMDsKY29uc3QgaW50IG1heHEgPSA1ZTUgKyAxMDsKY29uc3QgaW50IExPRyA9IGxvZzIobWF4bikrMjsKaW50IG47CgpwYWlyPHBpaSwgaW50PiBMW21heG5dOyAvL0xleGljb2dyYXBoeSBvcmRlcjogb2Ygc3RyaW5nIGF0IHBvc2l0aW9uIGhhdmUgcmFuayBpIC0+IHN0YXJ0IGF0IHBvc2l0aW9uIExbaV0uc2Vjb25kCmludCBSW0xPR11bbWF4bl07IC8vUmFua2luZyBvZiBzdHJpbmcgc3RhcnQgYXQgcG9zaXRpb24gaSwgaGF2ZSBsZW5ndGggb2YgMl5sb2cgLT4gaGF2ZSByYW5rIFJbbG9nXVtpXQppbnQgU0FbbWF4bl07Cgp2b2lkIGJ1aWxkX1NBKGNvbnN0IHN0cmluZyYgcyl7CiAgICB1cChpLDEsbikgUlswXVtpXSA9IHNbaV07CgogICAgZm9yIChpbnQgUE9XID0gMTsgKDEgPDwgKFBPVy0xKSkgPD0gbjsgUE9XKyspewogICAgICAgIHVwKGksMSxuKXsKICAgICAgICAgICAgTFtpXS5mLmYgPSBSW1BPVy0xXVtpXTsKICAgICAgICAgICAgaW50IGsgPSBpICsgKDEgPDwgKFBPVy0xKSk7CiAgICAgICAgICAgIGlmIChrIDw9IG4pIExbaV0uZi5zID0gUltQT1ctMV1ba107CiAgICAgICAgICAgIGVsc2UgTFtpXS5mLnMgPSAtMTsKICAgICAgICAgICAgTFtpXS5zID0gaTsKICAgICAgICB9CiAgICAgICAgc29ydChMKzEsIEwrbisxKTsKCiAgICAgICAgaW50IGNudCA9IDA7CiAgICAgICAgdXAoaSwxLG4pewogICAgICAgICAgICBpZiAoTFtpXS5mID09IExbaS0xXS5mKSBSW1BPV11bTFtpXS5zXSA9IFJbUE9XXVtMW2ktMV0uc107CiAgICAgICAgICAgIGVsc2UgUltQT1ddW0xbaV0uc10gPSArK2NudDsKICAgICAgICB9CiAgICB9CgogICAgdXAoaSwxLG4pIFNBW2ldID0gTFtpXS5zOwp9CgppbnQgTENQW21heG5dOwppbnQgcG9zW21heG5dOwp2b2lkIEthc2FpKGNvbnN0IGludCBTQVtdLCBjb25zdCBzdHJpbmcmIHMpewogICAgdXAoaSwxLG4pIHBvc1tTQVtpXV0gPSBpOwoKICAgIGludCBrID0gMDsKICAgIHVwKGksMSxuKXsKICAgICAgICBpbnQmIGN1ciA9IHBvc1tpXTsKICAgICAgICBpbnQgaiA9IFNBW2N1ci0xXTsKICAgICAgICAvL2lmIHN1ZmZpeCBwYWlyIGF0IHBvc2l0aW9uIChpLCBqKSwgaGF2ZSByYW5rIChjdXIsIGN1ci0xKSBhbmQgTENQIGVxdWFsIHRvIGsKICAgICAgICAvL3RoZW4gc3VmZml4IHBhaXIgYXQgcG9zaXRpb24gKGkrMSwgaicpLCBoYXZlIHJhbmsoY3VyJywgY3VyJy0xKSBzaG91bGQgaGF2ZSBMQ1AgYXQgbGVhc3Qgay0xLCBhbmQgYXQgbW9zdC4uLgogICAgICAgIC8vZmluZCBhdCBhdCBtb3N0IG9uIHRoaXMgbGluZSA6KQogICAgICAgIHdoaWxlIChpK2sgPD0gbiAmJiBqK2sgPD0gbiAmJiBzW2kra10gPT0gc1tqK2tdKSArK2s7CiAgICAgICAgTENQW2N1cl0gPSBrOwogICAgICAgIGlmIChrKSAtLWs7CiAgICB9Cn0KCmludCBzcFtMT0ddW21heG5dOwppbnQgbG9nZ1ttYXhuXTsKdm9pZCBidWlsZF9zcGFyc2UoKXsKICAgIHVwKGksMSxuKSBzcFswXVtpXSA9IExDUFtpXTsKICAgIHVwKGksMixuKSBsb2dnW2ldID0gbG9nZ1soaSA+PiAxKV0gKyAxOwogICAgZm9yIChpbnQgaSA9IDE7ICgxIDw8IGkpIDw9IG47IGkrKyl7CiAgICAgICAgZm9yIChpbnQgaiA9IDE7IGogKyAoMSA8PCBpKSAtIDEgPD0gbjsgaisrKXsKICAgICAgICAgICAgc3BbaV1bal0gPSBtaW4oc3BbaS0xXVtqXSwgc3BbaS0xXVtqICsgKDEgPDwgKGktMSkpXSk7CiAgICAgICAgfQogICAgfQp9CgppbnQgUk1RKGNvbnN0IGludCYgbCwgY29uc3QgaW50JiByKXsKICAgIGludCBrID0gbG9nZ1tyIC0gbCArIDFdOwogICAgcmV0dXJuIG1pbihzcFtrXVtsXSwgc3Bba11bciAtICgxIDw8IGspICsgMV0pOwp9CgppbnQgZ2V0X2xlZnQoaW50IHUsIGNvbnN0IGludCYgbmVlZCl7CiAgICBpbnQgbCA9IDA7CiAgICBpbnQgciA9IHU7CiAgICB3aGlsZSAociAtIGwgPiAxKXsKICAgICAgICBpbnQgbWlkID0gKGwrcikgPj4gMTsKICAgICAgICBpZiAoUk1RKG1pZCwgdSkgPj0gbmVlZCkgciA9IG1pZDsKICAgICAgICBlbHNlIGwgPSBtaWQ7CiAgICB9CiAgICBpZiAoTENQW3JdID49IG5lZWQpIHJldHVybiByLTE7CiAgICByZXR1cm4gcjsKfSAvLyBGaW5kIGZyb20gWzEgLT4gdV0KCmludCBnZXRfcmlnaHQoaW50IHUsIGNvbnN0IGludCYgbmVlZCl7CiAgICArK3U7CiAgICBpbnQgbCA9IHU7CiAgICBpbnQgciA9IG4rMTsKICAgIHdoaWxlIChyIC0gbCA+IDEpewogICAgICAgIGludCBtaWQgPSAobCtyKSA+PiAxOwogICAgICAgIGlmIChSTVEodSwgbWlkKSA+PSBuZWVkKSBsID0gbWlkOwogICAgICAgIGVsc2UgciA9IG1pZDsKICAgIH0KCiAgICBpZiAoTENQW2xdID49IG5lZWQpIHJldHVybiBsOwogICAgcmV0dXJuIGwtMTsKfSAvLyBGaW5kIGZyb20gW3UrMSAtPiBuXQoKaW50IEJJVFttYXhuXTsKdm9pZCB1cGRhdGUoaW50IHgsIGNvbnN0IGludCB2YWwpewogICAgd2hpbGUgKHggPD0gbil7CiAgICAgICAgQklUW3hdICs9IHZhbDsKICAgICAgICB4ICs9ICh4ICYgKC14KSk7CiAgICB9Cn0KCmludCBnZXQoaW50IHgpewogICAgaW50IHJlcyA9IDA7CiAgICB3aGlsZSAoeCl7CiAgICAgICAgcmVzICs9IEJJVFt4XTsKICAgICAgICB4IC09ICh4ICYgKC14KSk7CiAgICB9CiAgICByZXR1cm4gcmVzOwp9CgpzdHJ1Y3QgZXZlbnR7CiAgICBpbnQgTCxSLGlkLFNJR047CiAgICBldmVudChpbnQgTCwgaW50IFIsIGludCBpZCwgaW50IFNJR04pOgogICAgICAgIEwoTCksIFIoUiksIGlkKGlkKSwgU0lHTihTSUdOKQogICAge30KfTsKdmVjdG9yPGV2ZW50PiBFW21heG5dOwoKaW50IGFuc1ttYXhxXTsKdm9pZCBzb2x2ZSgpewogICAgdXAoaSwxLG4pewogICAgICAgIHVwZGF0ZShTQVtpXSwgMSk7CiAgICAgICAgZm9yIChhdXRvIGUgOiBFW2ldKXsKICAgICAgICAgICAgaW50IEwgPSBlLkw7CiAgICAgICAgICAgIGludCBSID0gZS5SOwogICAgICAgICAgICBpbnQgaWQgPSBlLmlkOwogICAgICAgICAgICBpbnQgU0lHTiA9IGUuU0lHTjsKICAgICAgICAgICAgYW5zW2lkXSArPSBTSUdOICogKGdldChSKSAtIGdldChMLTEpKTsKICAgICAgICB9CiAgICB9Cn0KCnNpZ25lZCBtYWluKCl7CiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKICAgIGNpbi50aWUoMCk7CiAgICAjZGVmaW5lIFRhc2sgIkEiCiAgICBpZiAoZm9wZW4oVGFzayIuaW5wIiwgInIiKSl7CiAgICAgICAgZnJlb3BlbihUYXNrIi5pbnAiLCAiciIsIHN0ZGluKTsKICAgICAgICBmcmVvcGVuKFRhc2siLm91dCIsICJ3Iiwgc3Rkb3V0KTsKICAgIH0KCiAgICBzdHJpbmcgcyx0OwogICAgY2luID4+IHMgPj4gdDsKICAgIGludCBTU0laRSA9IHMuc2l6ZSgpOwoKICAgIHN0cmluZyBnID0gIkAiICsgcyArIHQ7CiAgICBuID0gZy5zaXplKCkgLSAxOwoKICAgIGJ1aWxkX1NBKGcpOwogICAgS2FzYWkoU0EsIGcpOwoKICAgIGJ1aWxkX3NwYXJzZSgpOwoKICAgIGludCBxOwogICAgY2luID4+IHE7CiAgICB1cChpLDEscSl7CiAgICAgICAgaW50IHNsLCBzciwgdGwsIHRyOwogICAgICAgIGNpbiA+PiBzbCA+PiBzciA+PiB0bCA+PiB0cjsKICAgICAgICBpbnQgc2xlbiA9IHNyIC0gc2wgKyAxOwogICAgICAgIGludCBMID0gZ2V0X2xlZnQocG9zW3NsXSwgc2xlbik7CiAgICAgICAgaW50IFIgPSBnZXRfcmlnaHQocG9zW3NsXSwgc2xlbik7CiAgICAgICAgaW50IEEgPSB0bCArIFNTSVpFOwogICAgICAgIGludCBCID0gdHIgKyBTU0laRSAtIHNsZW4gKyAxOwoKICAgICAgICBpZiAoQiA8IEEgfHwgUiA8IEwpIGNvbnRpbnVlOwogICAgICAgIEVbTC0xXS5lbXBsYWNlX2JhY2soZXZlbnQoQSwgQiwgaSwgLTEpKTsKICAgICAgICBFW1JdLmVtcGxhY2VfYmFjayhldmVudChBLCBCLCBpLCAxKSk7CiAgICB9CgogICAgc29sdmUoKTsKICAgIHVwKGksMSxxKSBjb3V0IDw8IGFuc1tpXSA8PCAiXG4iOwp9Cg==