結果
| 問題 |
No.263 Common Palindromes Extra
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2016-03-17 21:24:08 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 221 ms / 2,000 ms |
| コード長 | 1,864 bytes |
| コンパイル時間 | 923 ms |
| コンパイル使用メモリ | 79,904 KB |
| 実行使用メモリ | 146,820 KB |
| 最終ジャッジ日時 | 2024-11-29 23:13:06 |
| 合計ジャッジ時間 | 2,764 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 12 |
ソースコード
#include <iostream>
#include <string>
#include <vector>
#include <map>
#define ll long long
#define FOR(i,a,b) for(int i= (a); i<((int)b); ++i)
using namespace std;
struct Node {
map<char, ll> next;
ll len = 0;
ll sl = 0;
};
class PalindromicTree {
public:
string str;
vector<Node> tree;
ll l_idx, ms_idx;
PalindromicTree(string s) : str(s) {
this->tree.resize(s.size() + 2);
this->l_idx = 1;
this->ms_idx = 1;
this->tree[0].len = -1;
}
void addLetter(int pos) {
char nc = this->str[pos];
ll A = ms_idx;
while (true) {
int p = pos - 1 - tree[A].len;
if (p >= 0 && this->str[p] == nc) break;
A = tree[A].sl;
}
if (this->tree[A].next[nc] != 0) {
ms_idx = tree[A].next[nc];
return;
}
ms_idx = ++this->l_idx;
Node &nn = tree[this->l_idx];
nn.len = tree[A].len + 2;
tree[A].next[nc] = this->l_idx;
if (nn.len == 1) { nn.sl = 1; return;}
ll B = A;
while (true) {
B = tree[B].sl;
int p = pos - 1 - tree[B].len;
if (p >= 0 && this->str[p] == nc) break;
}
nn.sl = tree[B].next[nc];
}
};
int main() {
string s, t, u;
cin >> s >> t;
u = s + "<>" + t;
vector<vector<ll>> dp(2, vector<ll>(u.size() + 2, 0));
PalindromicTree pt(u);
FOR(i, 0, u.size()) {
pt.addLetter(i);
if (i < s.size()) {
dp[0][pt.ms_idx]++;
}
if (i >= s.size() + 1) {
dp[1][pt.ms_idx]++;
}
}
ll ans = 0;
for (int i = pt.l_idx; i >= 2; i--) {
ans += dp[0][i] * dp[1][i];
dp[0][pt.tree[i].sl] += dp[0][i];
dp[1][pt.tree[i].sl] += dp[1][i];
}
cout << ans << endl;
return 0;
}