Problem:
Score : 600 points

Problem Statement

Given are two strings s and t consisting of lowercase English letters. Determine if the number of non-negative integers i satisfying the following condition is finite, and find the maximum value of such i if the number is finite.

There exists a non-negative integer j such that the concatenation of i copies of t is a substring of the concatenation of j copies of s.

Notes

A string a is a substring of another string b if and only if there exists an integer x (0 \leq x \leq |b| - |a|) such that, for any y (1 \leq y \leq |a|), a_y = b_{x+y} holds.

We assume that the concatenation of zero copies of any string is the empty string. From the definition above, the empty string is a substring of any string. Thus, for any two strings s and t, i = 0 satisfies the condition in the problem statement.

Constraints

1 \leq |s| \leq 5 \times 10^5

1 \leq |t| \leq 5 \times 10^5

s and t consist of lowercase English letters.

Input

Input is given from Standard Input in the following format:

s
t

Output

If the number of non-negative integers i satisfying the following condition is finite, print the maximum value of such i; if the number is infinite, print -1.

Sample Input 1

abcabab
ab

Sample Output 1

3

The concatenation of three copies of t, ababab, is a substring of the concatenation of two copies of s, abcabababcabab, so i = 3 satisfies the condition.

On the other hand, the concatenation of four copies of t, abababab, is not a substring of the concatenation of any number of copies of s, so i = 4 does not satisfy the condition.

Similarly, any integer greater than 4 does not satisfy the condition, either. Thus, the number of non-negative integers i satisfying the condition is finite, and the maximum value of such i is 3.

Sample Input 2

aa
aaaaaaa

Sample Output 2

-1

For any non-negative integer i, the concatenation of i copies of t is a substring of the concatenation of 4i copies of s. Thus, there are infinitely many non-negative integers i that satisfy the condition.

Sample Input 3

aba
baaab

Sample Output 3

0

As stated in Notes, i = 0 always satisfies the condition.

Solution in C++14 (GCC 5.4.1) (judge verdict: Runtime Error)

// Words are flowing out like endless rain into a paper cup
// They slither while they pass they slip away across the universe
// Pools of sorrow, waves of joy are drifting through my open mind
// Possessing and caressing me

#include <bits/stdc++.h>
using namespace std;

using LL = long long;

namespace _buff {

const size_t BUFF = 1 << 19;
char ibuf[BUFF], *ib = ibuf, *ie = ibuf;
char getc() {
    if (ib == ie) {
        ib = ibuf;
        ie = ibuf + fread(ibuf, 1, BUFF, stdin);
    }
    return ib == ie ? -1 : *ib++;
}

}

LL read() {
    using namespace _buff;
    LL ret = 0;
    bool pos = true;
    char c = getc();
    for (; (c < '0' || c > '9') && c != '-'; c = getc()) {
        assert(~c);
    }
    if (c == '-') {
        pos = false;
        c = getc();
    }
    for (; c >= '0' && c <= '9'; c = getc()) {
        ret = (ret << 3) + (ret << 1) + (c ^ 48);
    }
    return pos ? ret : -ret;
}

template <typename T>
void chkmax(T &dp, const T &val) {
    if (val > dp) dp = val;
}

const size_t N = 3e5 + 5;

char s[N], ss[N], t[N];
int ls, lt, z[N], indeg[N], dis[N];
bool ok[N];
vector<int> g[N];

void z_func(char s[], int z[]) {
    int len = strlen(s);
    for (int i = 1, l = 0, r = 0; i < len; ++i) {
        if (i < r) {
            z[i] = min(z[i - l], r - i);
        }
        for (; i + z[i] < len && s[i + z[i]] == s[z[i]]; ++z[i]) {}
        if (r <= i + z[i]) {
            l = i;
            r = i + z[i];
        }
    }
}

int main() {
    scanf("%s%s", s, t);
    ls = strlen(s);
    lt = strlen(t);
    copy(t, t + lt, ss);
    for (int i = 0, j = lt; j < N - 1; (++i) %= ls, ++j) {
        ss[j] = s[i];
    }
    z_func(ss, z);
    int cnt = 0;
    for (int i = 0; i < ls; ++i) {
        if (z[i + lt] >= lt) {
            cnt += ok[i] = true;
        }
    }
    if (!cnt) {
        return puts("0"), 0;
    }
    for (int i = 0; i < ls; ++i) {
        if (ok[i] && ok[(i + lt) % ls]) {
            g[i].emplace_back((i + lt) % ls);
            ++indeg[(i + lt) % ls];
        }
    }

    static int que[N];
    int ql = 0, qr = 0;
    for (int i = 0; i < ls; ++i) {
        if (ok[i] && !indeg[i]) {
            dis[i] = 1;
            que[qr++] = i;
        }
    }
    int ans = 0;
    while (ql < qr) {
        int x = que[ql++];
        chkmax(ans, dis[x]);
        for (int y : g[x]) {
            chkmax(dis[y], dis[x] + 1);
            if (!(--indeg[y])) {
                que[qr++] = y;
            }
        }
    }
    if (qr < cnt) ans = -1;
    cout << ans << '\n';
    return 0;
}