#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const ll N = 2e6 + 2;
const ll M = 37;
const ll mod = 1e9 + 7;
ll inv, pre_hash[N];
map < ll, ll > D;
ll Pow(ll a, ll b) {
if ( b == 0) return 1;
if ( b == 1) return a % mod;
ll r = Pow(a, b/2);
r = r * r % mod;
if ( b % 2 == 1) r = r * a % mod;
return r;
}
ll Find_pre(ll lo , ll hi) {
ll r= pre_hash[hi];
if ( lo > 0) r = r - pre_hash[lo - 1];
r = (r % mod + mod) % mod;
r = r * Pow(inv, lo) % mod;
return r;
}
ll ans = 0;
void Go() {
ll s, i, p, r;
string str;
cin >> str;
s = 0;
for (i = 0; i < str.size(); i ++) {
s = s + (Pow(M, i) * (str[i] - 'A' + 1));
pre_hash[i] = s;
}
p = Find_pre(0, str.size() - 1);
for (i = 1; i <= str.size(); i ++) {
s = Find_pre(0, i - 1);
r = Find_pre(str.size() - i, str.size() - 1);
if (r == s) {
D[p] = max(D[p], D[r] + 1);
}
}
D[p] = max(D[p], 1ll);
ans = max(ans, D[p]);
}
int main() {
ll n, i;
inv = Pow(M, mod - 2);
cin >> n;
for (i = 1; i <= n; i ++) {
Go();
}
cout << ans << endl;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |