#include<bits/stdc++.h>
using namespace::std;
const int B[] = {311, 257};
const int MOD = 1e9 + 7;
const int N = 2000000 + 5;
int mul(int a, int b){
return (1ll * a * b) % MOD;
}
int pow_mod(int a, int b){
int r = 1;
while(b){
if(b & 1) r = mul(r, a);
a = mul(a, a);
b >>= 1;
}
return r;
}
int n;
char s[N];
int pot[2][N];
int poti[2][N];
int prefix[2][N];
map<pair<int, int>, int> best;
void init(){
for(int id = 0; id < 2; id++){
pot[id][0] = 1;
for(int i = 1; i < N; i++) pot[id][i] = mul(pot[id][i - 1], B[id]);
poti[id][N - 1] = pow_mod(pot[id][N - 1], MOD - 2);
for(int i = N - 2; i >= 0; i--) poti[id][i] = mul(poti[id][i + 1], B[id]);
}
}
bool check(int l, int len){
for(int id = 0; id < 2; id++){
int L = prefix[id][l];
int R = mul((prefix[id][len] + MOD - prefix[id][len - l]), poti[id][len - l]);
if(L != R) return false;
}
return true;
}
int main(){
init();
scanf("%d", &n);
for(int i = 1; i <= n; i++){
scanf("%s", s + 1);
int len = strlen(s + 1);
for(int id = 0; id < 2; id++)
for(int j = 1; j <= len; j++) prefix[id][j] = (prefix[id][j - 1] + mul(pot[id][j], s[j])) % MOD;
int cur_best = 0;
for(int l = 1; l <= len; l++){
if(check(l, len)){
int cur = 1 + (best.count(make_pair(prefix[0][l], prefix[1][l])) ? best[make_pair(prefix[0][l], prefix[1][l])] : 0);
cur_best = max(cur_best, cur);
}
}
best[make_pair(prefix[0][len], prefix[1][len])] = max(best[make_pair(prefix[0][len], prefix[1][len])], cur_best);
}
int ans = 0;
for(auto e : best){
if(ans < e.second) ans = e.second;
}
printf("%d\n", ans);
return 0;
}
Compilation message
savez.cpp: In function 'int main()':
savez.cpp:49:7: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
49 | scanf("%d", &n);
| ~~~~~^~~~~~~~~~
savez.cpp:51:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
51 | scanf("%s", s + 1);
| ~~~~~^~~~~~~~~~~~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
53 ms |
31564 KB |
Output is correct |
2 |
Correct |
55 ms |
31564 KB |
Output is correct |
3 |
Correct |
55 ms |
31512 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
50 ms |
31564 KB |
Output is correct |
2 |
Correct |
51 ms |
31528 KB |
Output is correct |
3 |
Correct |
55 ms |
31528 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
87 ms |
31628 KB |
Output is correct |
2 |
Correct |
84 ms |
31528 KB |
Output is correct |
3 |
Correct |
107 ms |
31640 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
53 ms |
31628 KB |
Output is correct |
2 |
Correct |
82 ms |
31708 KB |
Output is correct |
3 |
Correct |
92 ms |
31692 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
81 ms |
31632 KB |
Output is correct |
2 |
Correct |
82 ms |
31688 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
86 ms |
31620 KB |
Output is correct |
2 |
Correct |
81 ms |
31632 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
89 ms |
31628 KB |
Output is correct |
2 |
Correct |
81 ms |
31660 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
83 ms |
31524 KB |
Output is correct |
2 |
Correct |
81 ms |
31564 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
90 ms |
31660 KB |
Output is correct |
2 |
Correct |
88 ms |
31544 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
108 ms |
31612 KB |
Output is correct |
2 |
Correct |
103 ms |
31620 KB |
Output is correct |
3 |
Correct |
133 ms |
31604 KB |
Output is correct |