# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
397598 | Drew_ | 회문 (APIO14_palindrome) | C++14 | 60 ms | 54880 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
#define ll long long
#define pb push_back
const int MAX = 3e5 + 7;
struct Node
{
int l, r;
int len, occ = 0;
int ch[26]; //adding a character
int slink; //suffix link
};
int sz, cur;
Node tree[MAX]; //eertree
string s;
void addChar(int idx)
{
int tmp = cur;
while (1)
{
if (idx - tree[tmp].len >= 1 && s[idx] == s[idx - tree[tmp].len - 1])
break;
tmp = tree[tmp].slink;
}
if (tree[tmp].ch[s[idx] - 'a'] != 0)
{
cur = tree[tmp].ch[s[idx] - 'a'];
return;
}
sz++;
tree[tmp].ch[s[idx] - 'a'] = sz;
tree[sz].len = tree[tmp].len + 2;
tree[sz].r = idx;
tree[sz].l = idx - tree[sz].len + 1;
//getting suffix link
tmp = tree[tmp].slink;
cur = sz;
if (tree[cur].len == 1)
{
tree[cur].slink = 2;
return;
}
while (1)
{
if (idx - tree[tmp].len >= 1 && s[idx] == s[idx - tree[tmp].len - 1])
break;
tmp = tree[tmp].slink;
}
tree[cur].slink = tree[tmp].ch[s[idx] - 'a'];
}
int main()
{
ios :: sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
tree[1].len = -1;
tree[1].slink = 1;
tree[2].len = 0;
tree[2].slink = 1;
sz = 2; cur = 1;
cin >> s;
for (int i = 0; i < s.size(); ++i)
{
addChar(i);
tree[cur].occ++;
}
ll res = 0;
int indegree[MAX];
vector<int> adj[MAX];
queue<int> q;
for (int i = 3; i <= sz; ++i)
{
adj[i].pb(tree[i].slink);
indegree[tree[i].slink]++;
}
for (int i = 3; i <= sz; ++i)
if (indegree[i] == 0)
q.push(i);
while (!q.empty())
{
int node = q.front();
q.pop();
res = max(res, 1LL * tree[node].len * tree[node].occ);
for (int to : adj[node])
{
tree[to].occ += tree[node].occ;
indegree[to]--;
if (indegree[to] == 0)
q.push(to);
}
}
cout << res << '\n';
return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |