Submission #220226

#TimeUsernameProblemLanguageResultExecution timeMemory
220226kostia244Palindromes (APIO14_palindrome)C++17
73 / 100
75 ms74912 KiB
#pragma GCC optimize("O2")
//#pragma GCC optimize("unroll-loops")
//#pragma GCC target("avx,avx2,sse,sse2,ssse3,tune=native")
#include<bits/stdc++.h>
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
#define pb push_back
using namespace std;
using ll = long long;
//using arr = array;
using pi = pair<int, int>;
using vi = vector<int>;
using vpi = vector<pi>;
using ld = long double;
//#include<bits/extc++.h>
//using namespace __gnu_pbds;
//using oset = tree<ll, null_type, less<ll>, rb_tree_tag, tree_order_statistics_node_update>;
const int maxn = 1<<18, mod = (119<<23)+1, lg = 18;
int link[maxn], to[maxn][26], len[maxn], occ[maxn], sz, cur;
string s;
void init() {
	sz = 2;
	cur = 0;
	memset(link, 0, sizeof link);
	memset(len, 0, sizeof len);
	memset(to, 0, sizeof to);
	len[0] = -1;
}
int get_link(int v) {
	while((int)s.size()-len[v]-2<0 || s[s.size()-len[v]-2]!=s.back()) v = link[v];
	return v;
}

void add(char c) {
	s += c, c -= 'a';
	cur = get_link(cur);
	if(!to[cur][c]) {
		to[cur][c] = sz;
		link[sz] = cur ? to[get_link(link[cur])][c] : 1;
		len[sz] = len[cur]+2;
		sz++;
	}
	cur = to[cur][c];
	occ[cur]++;
}
vi g[maxn];
ll ans = 0;
ll dfs(int v) {
	ll cnt = occ[v];
	for(auto i : g[v]) {
		cnt += dfs(i);
	}
	if(len[v] > 0) ans = max(len[v] * 1ll * cnt, ans);
	return cnt;
}
int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	string s;
	cin >> s;
	init();
	for(auto &i : s) add(i);
	for(int i = 1; i < sz; i++) g[link[i]].pb(i);
	dfs(0); 
	cout << ans << '\n';
}

Compilation message (stderr)

palindrome.cpp: In function 'void add(char)':
palindrome.cpp:37:15: warning: array subscript has type 'char' [-Wchar-subscripts]
  if(!to[cur][c]) {
               ^
palindrome.cpp:38:12: warning: array subscript has type 'char' [-Wchar-subscripts]
   to[cur][c] = sz;
            ^
palindrome.cpp:39:45: warning: array subscript has type 'char' [-Wchar-subscripts]
   link[sz] = cur ? to[get_link(link[cur])][c] : 1;
                                             ^
palindrome.cpp:43:17: warning: array subscript has type 'char' [-Wchar-subscripts]
  cur = to[cur][c];
                 ^
#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...