結果
| 問題 | No.263 Common Palindromes Extra |
| コンテスト | |
| ユーザー |
kriii
|
| 提出日時 | 2019-08-24 21:42:51 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.89.0) |
| 結果 |
AC
|
| 実行時間 | 284 ms / 2,000 ms |
| コード長 | 1,727 bytes |
| 記録 | |
| コンパイル時間 | 908 ms |
| コンパイル使用メモリ | 72,748 KB |
| 実行使用メモリ | 150,252 KB |
| 最終ジャッジ日時 | 2024-10-14 13:18:02 |
| 合計ジャッジ時間 | 2,622 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 12 |
ソースコード
#include <iostream>
#include <vector>
#include <string>
using namespace std;
struct eertree{
eertree(string &s){
push(s);
}
struct node{
int nxt[26] = { 0, };
int len = 0, suf = 0, occur = 0;
};
vector<node> trie;
int size, maxSuf;
void push(string &str){
trie.clear();
trie.resize(3);
size = 2;
trie[1].len = -1, trie[1].suf = 1;
trie[2].len = +0, trie[2].suf = 1;
maxSuf = 2;
for (int pos = 0; pos < str.length(); pos++)
{
int cur = maxSuf, len = 0, sym = str[pos] - 'A';
while (1){
len = trie[cur].len;
if (pos - len - 1 >= 0 && str[pos - len - 1] == str[pos]) break;
cur = trie[cur].suf;
}
if (trie[cur].nxt[sym]){
maxSuf = trie[cur].nxt[sym];
}
else{
maxSuf = ++size;
trie.push_back(node());
trie[size].len = trie[cur].len + 2;
trie[cur].nxt[sym] = size;
if (trie[size].len == 1){
trie[size].suf = 2;
}
else{
while (1){
cur = trie[cur].suf;
len = trie[cur].len;
if (pos - len - 1 >= 0 && str[pos - len - 1] == str[pos]){
trie[size].suf = trie[cur].nxt[sym];
break;
}
}
}
}
trie[maxSuf].occur++;
}
for (int i = size; i >= 3; i--){
int suf = trie[i].suf;
if (suf >= 3){
trie[suf].occur += trie[i].occur;
}
}
}
};
long long inter(eertree& a, eertree& b, int i, int j)
{
long long res = (long long)a.trie[i].occur * b.trie[j].occur;
for (int sym = 0; sym < 26; sym++){
int nxtI = a.trie[i].nxt[sym];
int nxtJ = b.trie[j].nxt[sym];
if (nxtI && nxtJ){
res += inter(a, b, nxtI, nxtJ);
}
}
return res;
}
int main()
{
string s, t;
cin >> s >> t;
eertree p(s), q(t);
cout << inter(p, q, 1, 1) + inter(p, q, 2, 2);
return 0;
}
kriii