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: Wrong Answer)

#include <iostream>
#include <vector>

using namespace std;

const int N_MAX = 500001;

int h[N_MAX];

void init(string S){
    h[0] = -1;
    h[1] = -1;
    for(int i = 2; i <= S.size(); i++){
        if(h[i-1] == -1){
             if(S[i-1] == S[0]) h[i] = 1;
             else h[i] = -1;
        }else{
            if(S[i-1] == S[h[i-1]]) h[i] = h[i-1]+1;
            else h[i] = -1;
        }
    }
}

//find S in T
vector<int> kmp(string T, string S){
    vector<int> ans;
    int k = 0;
    init(S);
    int i = 0;
    while(i < T.size()){
        if(S[k] == T[i]){
            k++;
            i++;
        }else{
            if(h[k] == -1){
                k = 0;
                i++;
            }else{
                k = h[k];
            }
        }
        if(k == S.size()){
            ans.push_back(i-S.size());
            k = h[k];
        }
    }
    return ans;
}

struct UnionFind {
  vector<int> data;
  UnionFind(int size) : data(size, -1) { }
  bool unionSet(int x, int y) {
    x = root(x); y = root(y);
    if (x != y) {
      if (data[y] < data[x]) swap(x, y);
      data[x] += data[y]; data[y] = x;
    }
    return x != y;
  }
  bool findSet(int x, int y) {
    return root(x) == root(y);
  }
  int root(int x) {
    return data[x] < 0 ? x : data[x] = root(data[x]);
  }
  int size(int x) {
    return -data[root(x)];
  }
};

int main(){
    string s, t;
    string S;
    cin >> s >> t;
    int n = (t.size()+s.size()-1)/s.size();
    
    for(int i = 0; i <= n; i++){
        S += s;
    }
    
    vector<int> v = kmp(S, t);
    UnionFind uf(s.size());
    
    for(int i = 0; i < v.size(); i++){
        if(v[i] < s.size()){
            if(!uf.findSet(v[i], (v[i]+t.size())%s.size())){
                uf.unionSet(v[i], (v[i]+t.size())%s.size());
            }else{
                cout << -1 << endl;
                return 0;
            }
        }
    }
    int ans = 0;
    for(int i = 0; i < s.size(); i++){
        ans = max(ans, uf.size(i)-1);
    }
    cout << ans << endl;
}