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 <bits/stdc++.h>
#include <unordered_set>
using namespace std;
#define ll long long
#define rep(i,n) for(int (i)=0;(i)<(n);(i)++)
#define repeat(i,s,n) for(int (i)=s; (i)<(n); (i)++)
#define revrep(i,n) for(int (i)=(n)-1;i>=0; i--)

// prefix function O(n) (kmp algorithm)
// from https://cp-algorithms.com/string/prefix-function.html
vector<int> prefix_function(string s) {
    int n = (int)s.length();
    vector<int> pi(n);
    for (int i = 1; i < n; i++) {
        int j = pi[i-1];
        while (j > 0 && s[i] != s[j])
            j = pi[j-1];
        if (s[i] == s[j])
            j++;
        pi[i] = j;
    }
    return pi;
}

// verified with https://codeforces.com/contest/1138/problem/D
int min_period_of_string(string s) {
  int n=s.length();
  vector<int> pi=prefix_function(s);
  return n-pi[n-1];
}

// https://www.coursera.org/lecture/algorithms-on-strings/knuth-morris-pratt-algorithm-73RS1
// expects p and t dont include '$'
vector<int> mp_pattern_search(string p, string t) {
  string s = p+'$'+t;
  vector<int> pi=prefix_function(s);
  vector<int> ret;
  for(int i=p.size()+1;i<s.size(); i++)
    if(pi[i]==p.size())
      ret.push_back(i-2*p.size());
  return ret;
}

int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);
  cout<<setprecision(std::numeric_limits<float>::max_digits10);
  cout<<fixed;
  string s,t;
  cin>>s>>t;
  int p_s = min_period_of_string(s);
  int p_t = min_period_of_string(t);
  if(p_s==p_t) {
    bool f=true;
    rep(i,p_s) {
      f&=(s[i]==t[i]);
    }
    if(f&&(s.size()%p_s==0)&&(t.size()%p_t==0)) {
      cout << -1 << endl;
      return 0;
    }
  }
  string ss = s+s;
  vector<int> found = mp_pattern_search(t,ss);
  if(found.size()==0) {
    cout << 0 << endl;
    return 0;
  }
  int prev = found[0];
  int cnt=1;
  int ans=cnt;
  repeat(i,1,found.size()) {
    if(prev+t.size()==found[i]) {
      cnt++;
    } else {
      ans=max(ans,cnt);
      cnt=1;
    }
    prev=found[i];
  }
  ans=max(ans,cnt);
  cout << ans << endl;
  return 0;
}