結果
| 問題 |
No.263 Common Palindromes Extra
|
| コンテスト | |
| ユーザー |
miscalc
|
| 提出日時 | 2025-10-24 04:51:17 |
| 言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 125 ms / 2,000 ms |
| コード長 | 2,568 bytes |
| コンパイル時間 | 3,003 ms |
| コンパイル使用メモリ | 288,484 KB |
| 実行使用メモリ | 150,384 KB |
| 最終ジャッジ日時 | 2025-10-24 04:51:22 |
| 合計ジャッジ時間 | 4,532 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 12 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pll = pair<ll, ll>;
#define vc vector
using vl = vc<ll>;
#define ov(a, b, c, name, ...) name
#define rep2(i, l, r) for(ll i = (l); i < ll(r); i++)
#define rep1(i, n) rep2(i, 0, n)
#define rep(...) ov(__VA_ARGS__, rep2, rep1)(__VA_ARGS__)
#define fec(...) for(const auto& __VA_ARGS__)
#define per(i, a, b) for(ll i = ll(a) - 1; i >= ll(b); i--)
#define ALL(x) begin(x), end(x)
#define SZ(x) (ll) size(x)
#define LB(v, x) (lower_bound(ALL(v), x) - begin(v))
#define eb emplace_back
bool chmin(auto& a, auto b) { return a > b ? a = b, 1 : 0; }
bool chmax(auto& a, auto b) { return a < b ? a = b, 1 : 0; }
const ll INF = ll(4e18) + 100;
void printvec(const auto& v) {
for(auto it = begin(v); it != end(v); it++) cout << *it << " ";
cout << endl;
}
#ifdef LOCAL
#define local(...) __VA_ARGS__
#else
#define local(...)
#endif
// 頂点: ODD (0), EVEN (1), 含まれる回文
// 順辺 (par, chi): 両側に 1 文字足してできる回文への辺
// 逆辺 (suf): 最大回文接尾辞への辺, EVEN -> ODD
template<int C = 26, char first = 'a'> struct Eertree {
string s;
vc<int> len{-1, 0}, suf{0, 0}, par{0, 0}, vs;
vc<array<int, C>> chi;
int cur = 1; // 現在の文字列の最大回文接尾辞の頂点番号
Eertree() : chi(2) { rep(i, 2) fill(ALL(chi[i]), -1); }
int findpar(int v) {
for(int i = s.size() - 1;; v = suf[v]) {
int j = i - 1 - len[v];
if(j >= 0 && s[j] == s[i]) return v;
}
}
void add(char ch) {
s += ch;
int j = ch - first, p = findpar(cur), v = chi[p][j];
if(v != -1) {
vs.eb(cur = v);
return;
}
vs.eb(chi[p][j] = cur = len.size());
len.eb(len[p] + 2), par.eb(p);
suf.eb(p == 0 ? 1 : chi[findpar(suf[p])][j]);
chi.eb(), fill(ALL(chi.back()), -1);
}
// 各回文の出現回数
vl count() {
int n = len.size();
vl cnt(n);
fec(v : vs) cnt[v]++;
per(i, n, 1) cnt[suf[i]] += cnt[i];
return cnt;
}
};
void main2()
{
string S,T;
cin>>S>>T;
Eertree<28, 'A'> et;
fec(c : S) et.add(c);
vl f = et.count();
et.add('A' + 26), et.add('A' + 27);
fec(c : T) et.add(c);
vl g = et.count();
local(printvec(f), printvec(g));
ll ans = 0;
rep(i, 2, f.size()) ans += f.at(i) * (g.at(i) - f.at(i));
cout<<ans<<endl;
}
int main() {
#ifndef LOCAL
cin.tie(0)->sync_with_stdio(0), cout.tie(0);
#endif
local(while(true)) {
ll t = 1;
// cin >> t;
while(t--) main2();
}
}
miscalc