結果
問題 | No.263 Common Palindromes Extra |
ユーザー | kriii |
提出日時 | 2019-08-24 21:42:51 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.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; }