Submission #1265925

#TimeUsernameProblemLanguageResultExecution timeMemory
1265925canhnam357Savez (COCI15_savez)C++20
120 / 120
59 ms31816 KiB
#include <bits/stdc++.h>
using namespace std;
#define all(x) x.begin(), x.end()
#define int long long
#define MASK(i) (1LL << (i))
void ckmax(int& f, int s)
{
	f = (f > s ? f : s);
}
void ckmin(int& f, int s)
{
	f = (f < s ? f : s);
}
const int mod1 = 1035972859;
const int mod2 = 1704760909;
const int base = 256;
const int N = 2e6 + 5;
int inv1[N], inv2[N], h1[N], h2[N];
int power(int a, int b, int mod)
{
	int res = 1;
	while (b)
	{
		if (b & 1) (res *= a) %= mod;
		(a *= a) %= mod;
		b >>= 1;
	}
	return res;
}
string s;
void cal()
{
	h1[0] = h2[0] = s[0];
	int p1 = 1, p2 = 1;
	for (int i = 1; i < s.size(); i++)
	{
		(p1 *= base) %= mod1;
		(p2 *= base) %= mod2;
		h1[i] = (h1[i - 1] + s[i] * p1) % mod1;
		h2[i] = (h2[i - 1] + s[i] * p2) % mod2;
	}
}
int get(int l, int r)
{
	if (l == 0) return h1[r] * h2[r];
	int f = ((h1[r] - h1[l - 1] + mod1) * inv1[l]) % mod1;
	int z = ((h2[r] - h2[l - 1] + mod2) * inv2[l]) % mod2;
	return f * z; 
}
int32_t main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	inv1[N - 1] = power(power(base, N - 1, mod1), mod1 - 2, mod1);
	inv2[N - 1] = power(power(base, N - 1, mod2), mod2 - 2, mod2);
	for (int i = N - 2; i >= 0; i--)
	{
		inv1[i] = (inv1[i + 1] * base) % mod1;
		inv2[i] = (inv2[i + 1] * base) % mod2;
	}
	map<int, int> mp;
	int n;
	cin >> n;	
	for (int i = 0; i < n; i++)
	{
		cin >> s;
		cal();
		int m = s.size();
		int k = h1[s.size() - 1] * h2[s.size() - 1];
		int z = 1;
		for (int j = 0; j < m; j++)
		{
			if (get(0, j) == get(m - j - 1, m - 1))
			{
				if (mp.count(get(0, j)))
				{
					ckmax(z, mp[get(0, j)] + 1);
				}
			}
		}
		ckmax(mp[k], z);
	}
	int ans = 0;
	for (auto x : mp) ckmax(ans, x.second);
	cout << ans;
	return 0;
}
#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...