#include <bits/stdc++.h> // NeOWami
using namespace std;
//Suffix array, dp
#define NeOWami signed
#define ft first
#define sc second
#define int long long
const int MOD = 1e9;
const int N = 2e5 + 5;
const int BASE = 31;
char base = char((int)'A' - 1);
string a, b, s;
int n, m, sz;
int POW[N], Rhash[N], sa[N];
int max_len[N], dp[N], ps[N];
int getRhash (int i, int len) {
return (Rhash[i] - Rhash[i + len] * POW[len]);
}
inline bool sufCmp(int i, int j) {
int lo = 1, hi = min(sz - i, sz - j);
while (lo <= hi) {
int mid = (lo + hi) >> 1;
if (getRhash(i, mid) == getRhash(j, mid)) lo = mid + 1;
else hi = mid - 1;
}
return s[i + hi] < s[j + hi];
}
void build_Suffix_Array() {
sz = n + m + 1;
s = a + base + b;
Rhash[sz] = 0;
for (int i = sz - 1; i >= 0; --i) {
Rhash[i] = Rhash[i + 1] * BASE + s[i] - base + 1;
sa[i] = i;
}
stable_sort(sa, sa + sz, sufCmp);
}
int getlen(int i, int j) {
int l = 1, r = sz - j, ans = 0;
while(l <= r) {
int mid = l + r >> 1;
if (getRhash(i, mid) == getRhash(j, mid)) {
ans = mid;
l = mid + 1;
}
else r = mid - 1;
}
return ans;
}
void progess() {
int idA = -1, idB = -1;
for (int i = 0; i < sz; i++) {
if (sa[i] < n) idA = sa[i];
if (sa[i] > n) idB = sa[i];
if (idA != -1 && idB != -1) max_len[idA + 1] = max(max_len[idA + 1], getlen(idA, idB));
}
idA = -1, idB = -1;
for (int i = sz - 1; i >= 0; i--) {
if (sa[i] < n) idA = sa[i];
if (sa[i] > n) idB = sa[i];
if (idA != -1 && idB != -1) max_len[idA + 1] = max(max_len[idA + 1], getlen(idA, idB));
}
}
int val(int i) {
if (i < 0) return 0;
return ps[i];
}
NeOWami main() {
cin.tie(NULL)->sync_with_stdio(false);
if(ifstream("STRGCUT.inp")) {
freopen("STRGCUT.inp", "r", stdin);
freopen("STRGCUT.out", "w", stdout);
}
POW[0] = 1; for (int i = 1; i < N; i++) POW[i] = POW[i - 1] * BASE;
cin >> a >> b;
n = a.size(); m = b.size();
build_Suffix_Array();
progess();
reverse(max_len + 1, max_len + n + 1);
dp[0] = ps[0] = 1;
for (int i = 1; i <= n; i++) {
dp[i] = (val(i - 1) - val(i - max_len[i] - 1) + MOD) % MOD;
ps[i] = (ps[i - 1] + dp[i]) % MOD;
}
cout << dp[n];
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+IC8vIE5lT1dhbWkKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLy9TdWZmaXggYXJyYXksIGRwCiNkZWZpbmUgTmVPV2FtaSBzaWduZWQKI2RlZmluZSBmdCBmaXJzdAojZGVmaW5lIHNjIHNlY29uZAojZGVmaW5lIGludCBsb25nIGxvbmcKY29uc3QgaW50IE1PRCA9IDFlOTsKY29uc3QgaW50IE4gPSAyZTUgKyA1Owpjb25zdCBpbnQgQkFTRSA9IDMxOwpjaGFyIGJhc2UgPSBjaGFyKChpbnQpJ0EnIC0gMSk7CnN0cmluZyBhLCBiLCBzOwppbnQgbiwgbSwgc3o7CmludCBQT1dbTl0sIFJoYXNoW05dLCBzYVtOXTsKaW50IG1heF9sZW5bTl0sIGRwW05dLCBwc1tOXTsKCmludCBnZXRSaGFzaCAoaW50IGksIGludCBsZW4pIHsKICAgIHJldHVybiAoUmhhc2hbaV0gLSBSaGFzaFtpICsgbGVuXSAqIFBPV1tsZW5dKTsKfQppbmxpbmUgYm9vbCBzdWZDbXAoaW50IGksIGludCBqKSB7CiAgICBpbnQgbG8gPSAxLCBoaSA9IG1pbihzeiAtIGksIHN6IC0gaik7CiAgICB3aGlsZSAobG8gPD0gaGkpIHsKICAgICAgICBpbnQgbWlkID0gKGxvICsgaGkpID4+IDE7CiAgICAgICAgaWYgKGdldFJoYXNoKGksIG1pZCkgPT0gZ2V0Umhhc2goaiwgbWlkKSkgbG8gPSBtaWQgKyAxOwogICAgICAgIGVsc2UgaGkgPSBtaWQgLSAxOwogICAgfQogICAgcmV0dXJuIHNbaSArIGhpXSA8IHNbaiArIGhpXTsKfQp2b2lkIGJ1aWxkX1N1ZmZpeF9BcnJheSgpIHsKICAgIHN6ID0gbiArIG0gKyAxOwogICAgcyA9IGEgKyBiYXNlICsgYjsKICAgIFJoYXNoW3N6XSA9IDA7CiAgICBmb3IgKGludCBpID0gc3ogLSAxOyBpID49IDA7IC0taSkgewogICAgICAgIFJoYXNoW2ldID0gUmhhc2hbaSArIDFdICogQkFTRSArIHNbaV0gLSBiYXNlICsgMTsKICAgICAgICBzYVtpXSA9IGk7CiAgICB9CiAgICBzdGFibGVfc29ydChzYSwgc2EgKyBzeiwgc3VmQ21wKTsKfQoKaW50IGdldGxlbihpbnQgaSwgaW50IGopIHsKICAgIGludCBsID0gMSwgciA9IHN6IC0gaiwgYW5zID0gMDsKICAgIHdoaWxlKGwgPD0gcikgewogICAgICAgIGludCBtaWQgPSBsICsgciA+PiAxOwogICAgICAgIGlmIChnZXRSaGFzaChpLCBtaWQpID09ICBnZXRSaGFzaChqLCBtaWQpKSB7CiAgICAgICAgICAgIGFucyA9IG1pZDsKICAgICAgICAgICAgbCA9IG1pZCArIDE7CiAgICAgICAgfQogICAgICAgIGVsc2UgciA9IG1pZCAtIDE7CiAgICB9IAogICAgcmV0dXJuIGFuczsKfQp2b2lkIHByb2dlc3MoKSB7CiAgICBpbnQgaWRBID0gLTEsIGlkQiA9IC0xOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzejsgaSsrKSB7CiAgICAgICAgaWYgKHNhW2ldIDwgbikgaWRBID0gc2FbaV07CiAgICAgICAgaWYgKHNhW2ldID4gbikgaWRCID0gc2FbaV07CiAgICAgICAgaWYgKGlkQSAhPSAtMSAmJiBpZEIgIT0gLTEpIG1heF9sZW5baWRBICsgMV0gPSBtYXgobWF4X2xlbltpZEEgKyAxXSwgZ2V0bGVuKGlkQSwgaWRCKSk7CiAgICB9CiAgICBpZEEgPSAtMSwgaWRCID0gLTE7CiAgICBmb3IgKGludCBpID0gc3ogLSAxOyBpID49IDA7IGktLSkgewogICAgICAgIGlmIChzYVtpXSA8IG4pIGlkQSA9IHNhW2ldOwogICAgICAgIGlmIChzYVtpXSA+IG4pIGlkQiA9IHNhW2ldOwogICAgICAgIGlmIChpZEEgIT0gLTEgJiYgaWRCICE9IC0xKSBtYXhfbGVuW2lkQSArIDFdID0gbWF4KG1heF9sZW5baWRBICsgMV0sIGdldGxlbihpZEEsIGlkQikpOwogICAgfQp9CmludCB2YWwoaW50IGkpIHsKICAgIGlmIChpIDwgMCkgcmV0dXJuIDA7CiAgICByZXR1cm4gcHNbaV07Cn0KTmVPV2FtaSBtYWluKCkgewogICAgY2luLnRpZShOVUxMKS0+c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKICAgIGlmKGlmc3RyZWFtKCJTVFJHQ1VULmlucCIpKSB7CiAgICAgICAgZnJlb3BlbigiU1RSR0NVVC5pbnAiLCAiciIsIHN0ZGluKTsKICAgICAgICBmcmVvcGVuKCJTVFJHQ1VULm91dCIsICJ3Iiwgc3Rkb3V0KTsKICAgIH0KICAgIFBPV1swXSA9IDE7IGZvciAoaW50IGkgPSAxOyBpIDwgTjsgaSsrKSBQT1dbaV0gPSBQT1dbaSAtIDFdICogQkFTRTsKICAgIGNpbiA+PiBhID4+IGI7CiAgICBuID0gYS5zaXplKCk7IG0gPSBiLnNpemUoKTsKICAgIGJ1aWxkX1N1ZmZpeF9BcnJheSgpOwogICAgcHJvZ2VzcygpOwogICAgcmV2ZXJzZShtYXhfbGVuICsgMSwgbWF4X2xlbiArIG4gKyAxKTsKICAgIGRwWzBdID0gcHNbMF0gPSAxOwogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSB7CiAgICAgICAgZHBbaV0gPSAodmFsKGkgLSAxKSAtIHZhbChpIC0gbWF4X2xlbltpXSAtIDEpICsgTU9EKSAlIE1PRDsKICAgICAgICBwc1tpXSA9IChwc1tpIC0gMV0gKyBkcFtpXSkgJSBNT0Q7CiAgICB9CiAgICBjb3V0IDw8IGRwW25dOwogICAgcmV0dXJuIDA7Cn0=