On this page
article
Palindromic Factorization
Sobre
Precisa da eertree
Computa o numero de formas de particionar cada
prefixo da string em strings palindromicas
O(n log n), considerando alfabeto O(1)
Link original: palindromicFactorization.cpp
Código
struct eertree { ... };
ll factorization(string s) {
int n = s.size(), sz = 2;
eertree PT(n);
vector<int> diff(n+2), slink(n+2), sans(n+2), dp(n+1);
dp[0] = 1;
for (int i = 1; i <= n; i++) {
PT.add(s[i-1]);
if (PT.size()+2 > sz) {
diff[sz] = PT.len[sz] - PT.len[PT.link[sz]];
if (diff[sz] == diff[PT.link[sz]])
slink[sz] = slink[PT.link[sz]];
else slink[sz] = PT.link[sz];
sz++;
}
for (int v = PT.last; PT.len[v] > 0; v = slink[v]) {
sans[v] = dp[i - (PT.len[slink[v]] + diff[v])];
if (diff[v] == diff[PT.link[v]])
sans[v] = (sans[v] + sans[PT.link[v]]) % MOD;
dp[i] = (dp[i] + sans[v]) % MOD;
}
}
return dp[n];
}