제출 #1172829

#제출 시각아이디문제언어결과실행 시간메모리
1172829nuutsnoyntonSavez (COCI15_savez)C++20
120 / 120
201 ms708 KiB
#include<bits/stdc++.h>

using namespace std;
using ll = long long;
const ll N = 2e6 + 2;
const ll M = 43;
const ll mod = 1e9 + 9;
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' + 2));
		pre_hash[i] = s;
	}
	p = Find_pre(0, str.size() - 1);
	D[p] ++;
	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);
		}
	}
	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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...