結果
問題 | No.263 Common Palindromes Extra |
ユーザー | shibh308 |
提出日時 | 2020-07-25 10:07:22 |
言語 | C++17 (gcc 12.3.0 + boost 1.83.0) |
結果 |
MLE
|
実行時間 | - |
コード長 | 2,721 bytes |
コンパイル時間 | 2,576 ms |
コンパイル使用メモリ | 224,696 KB |
実行使用メモリ | 243,684 KB |
最終ジャッジ日時 | 2024-06-26 22:50:41 |
合計ジャッジ時間 | 8,143 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 10 ms
6,816 KB |
testcase_01 | AC | 2 ms
6,812 KB |
testcase_02 | AC | 2 ms
6,944 KB |
testcase_03 | AC | 19 ms
6,940 KB |
testcase_04 | AC | 85 ms
7,552 KB |
testcase_05 | AC | 96 ms
6,944 KB |
testcase_06 | AC | 10 ms
6,944 KB |
testcase_07 | AC | 779 ms
139,544 KB |
testcase_08 | AC | 737 ms
138,848 KB |
testcase_09 | MLE | - |
testcase_10 | MLE | - |
testcase_11 | AC | 48 ms
6,944 KB |
ソースコード
#include <bits/stdc++.h> using namespace std; struct EerTree{ struct Node{ Node(int len) : len(len), sdep(0), slink(nullptr){} int len, sdep; map<char, Node*> ch; Node* slink; }; pair<Node*, Node*> root; Node* active_point; string s; EerTree(){ root.second = new Node(0); root.second->slink = root.first = active_point = new Node(-1); root.first->slink = root.first; } EerTree(string inp) : EerTree(){ for(auto c : inp) add(c); } Node* make(Node* par, char c){ if(par->ch.find(c) == par->ch.end()){ par->ch[c] = new Node(par->len + 2); Node* sl = par->slink; if(par->len == -1) sl = root.second; else{ while(1){ if(s[s.size() - sl->len - 2] == c){ sl = sl->ch[c]; break; }else if(sl->len < 0){ sl = root.second; break; }else sl = sl->slink; } } par->ch[c]->slink = sl; par->ch[c]->sdep = sl->sdep + 1; } return par->ch[c]; } void add(char c){ for(s += c; s[s.size() - active_point->len - 2] != c; active_point = active_point->slink); active_point = make(active_point, c); } }; map<EerTree::Node*, int> hcnt; long long search(EerTree::Node* x, EerTree::Node* y){ long long cnt = 1LL * hcnt[x] * hcnt[y]; if(x->len <= 0) cnt = 0; for(auto child : x->ch){ if(y->ch.find(child.first) != y->ch.end()){ cnt += search(x->ch[child.first], y->ch[child.first]); } } return cnt; } void dump(EerTree::Node* x, std::vector<EerTree::Node*>& v){ v.emplace_back(x); for(auto child : x->ch) dump(child.second, v); } signed main(){ string s, t; cin >> s >> t; EerTree es, et; for(auto c : s){ es.add(c); hcnt[es.active_point] += 1; } for(auto c : t){ et.add(c); hcnt[et.active_point] += 1; } std::vector<EerTree::Node*> sv, tv; dump(es.root.first, sv); dump(es.root.second, sv); dump(et.root.first, tv); dump(et.root.second, tv); sort(sv.begin(), sv.end(), [](auto x, auto y){return x->sdep > y->sdep;}); for(auto x : sv) hcnt[x->slink] += hcnt[x]; sort(tv.begin(), tv.end(), [](auto x, auto y){return x->sdep > y->sdep;}); for(auto x : tv) hcnt[x->slink] += hcnt[x]; cout << search(es.root.first, et.root.first) + search(es.root.second, et.root.second) << endl; }