#include <bits/stdc++.h>
using namespace std;
template<class ISqr, class T>
ISqr& operator>>(ISqr& is, vector<T>& v) { for (auto& x : v) is >> x; return is; }
#define SPEED \
ios_base::sync_with_stdio(0); \
cin.tie(NULL); \
cout.tie(NULL);
template <typename T>
void show(vector<T> &v) {
for (T i : v) {
cout << i << ' ';
}
cout << endl;
}
#define pb push_back
#define ins insert
#define fi first
#define se second
#define endl "\n"
#define ALL(x) x.begin(), x.end()
#define sz(x) x.size()
#define int long long
#define _ << " " <<
#define no cout << "No" << endl;
#define yes cout << "Yes" << endl;
#define impos cout << -1 << endl;
#define vi vector<int>
#define pii pair<int,int>
#define vpii vector<pii>
const int sz = 2e6 + 31;
const int base = 47;
const int mod = 1e18 + 3;
int mult(int a, int b) {
return (a * b) % mod;
}
int add(int a, int b) {
return a + b >= mod ? (a + b - mod) : a + b;
}
map<int,int>idx;
int pw[sz];
void solve() {
pw[0] = 1;
for(int i = 1; i < sz; i++) {
pw[i] = mult(pw[i-1], base);
}
int n; cin >> n;
vi dp(n + 1, 0);
dp[1] = 1;
for(int i = 1; i <= n; i++) {
dp[i] = 1;
string s;
cin >> s;
reverse(ALL(s));
string revs = s;
reverse(ALL(s));
int hashpre = 0, hashsuf = 0;
for(int j = 0; j < sz(s); j++) {
hashsuf = (hashsuf + mult((revs[j] - 'a' + 1), pw[j])) % mod;
hashpre = (hashpre + mult((s[j] - 'a' + 1), pw[j])) % mod;
// cout << hashsuf << " " << hashpre << endl;
if(hashpre == hashsuf) {
auto it = idx.find(hashpre);
if(it == idx.end()) continue;
dp[i] = max(dp[i], dp[it->se] + 1);
// cout << dp[i] << " " << dp[it->se] << endl;
}
}
idx[hashpre] = i; // s-in hash valuesini at
}
int ans = 0;
for(int i = 1; i <= n; i++) {
ans = max(ans, dp[i]);
}
cout << ans << endl;
}
signed main(){
SPEED;
int t = 1;
// cin >> t;
for(int cs = 1; cs <= t; cs++) {
solve();
}
}
Compilation message
savez.cpp: In function 'void solve()':
savez.cpp:69:26: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
69 | for(int j = 0; j < sz(s); j++) {
| ^
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
12 ms |
15952 KB |
Output is correct |
2 |
Correct |
12 ms |
16024 KB |
Output is correct |
3 |
Incorrect |
12 ms |
15952 KB |
Output isn't correct |
4 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
12 ms |
16024 KB |
Output is correct |
2 |
Correct |
12 ms |
15952 KB |
Output is correct |
3 |
Correct |
13 ms |
15952 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
22 ms |
15952 KB |
Output is correct |
2 |
Correct |
21 ms |
15952 KB |
Output is correct |
3 |
Correct |
27 ms |
16148 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
13 ms |
15952 KB |
Output is correct |
2 |
Correct |
31 ms |
16208 KB |
Output is correct |
3 |
Correct |
36 ms |
16212 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
25 ms |
16376 KB |
Output is correct |
2 |
Correct |
29 ms |
15952 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
25 ms |
16384 KB |
Output is correct |
2 |
Correct |
25 ms |
16380 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
26 ms |
16208 KB |
Output is correct |
2 |
Correct |
24 ms |
16208 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
27 ms |
16464 KB |
Output is correct |
2 |
Correct |
25 ms |
16464 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
39 ms |
17744 KB |
Output is correct |
2 |
Correct |
32 ms |
17744 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
47 ms |
19024 KB |
Output is correct |
2 |
Correct |
38 ms |
19024 KB |
Output is correct |
3 |
Correct |
56 ms |
23692 KB |
Output is correct |