Submission #1335198

#TimeUsernameProblemLanguageResultExecution timeMemory
1335198Jawad_Akbar_JJRima (COCI17_rima)C++20
42 / 140
107 ms12428 KiB
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;
const int N = 1<<19, M = 3<<20;
long long prv[N], cur[N], mod = 999999999999989;
int dp[N], n, Ans, mx;
vector<int> vec[M];

int main(){
	ios_base::sync_with_stdio(false); cin.tie(NULL);
	cin>>n;

	for (int i=1;i<=n;i++){
		string s;
		cin>>s;
		int m = s.size();

		for (int j=m-1;j>=0;j--){
			prv[i] = cur[i];
			cur[i] = (1LL * cur[i] * 149 + s[j]) % mod;
		}
		mx = max(mx, m);
		vec[m].push_back(i);
	}

	for (int i=1;i<=mx;i++){
		sort(begin(vec[i]), end(vec[i]), [&](int x, int y){return prv[x] < prv[y];});

		for (int j=0, k = 0;j<vec[i].size();j = k){
			while (k < vec[i].size() and prv[vec[i][k]] == prv[vec[i][j]])
				k++;
			for (int l=j;l<k;l++)
				dp[vec[i][l]] = k - j;
		}

		int k = 0, mx = 0;
		for (int j : vec[i]){
			while (k < vec[i-1].size() and prv[j] > cur[vec[i-1][k]])
				mx = 0, k++;
			while (k < vec[i-1].size() and prv[j] == cur[vec[i-1][k]])
				mx = max(mx, dp[vec[i-1][k]]), k++;
			dp[j] += mx;
			Ans = max(Ans, dp[j]);
		}

		sort(begin(vec[i]), end(vec[i]), [&](int x, int y){return cur[x] < cur[y];});
	}
	cout<<Ans<<'\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...