# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
549642 | krit3379 | Palindromes (APIO14_palindrome) | C++17 | 38 ms | 39124 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include<bits/stdc++.h>
using namespace std;
#define N 300005
struct node{
int nxt[26];
int deg;
int len;
int suff;
long long cnt;
}t[N];
int num,suff;
long long ans;
string s;
queue<int> q;
void add(int pos){
int cur=suff,idx=s[pos]-'a';
while(true){
if(pos-t[cur].len-1>=0&&s[pos-t[cur].len-1]==s[pos])break;
cur=t[cur].suff;
}
if(t[cur].nxt[idx]){
suff=t[cur].nxt[idx];
t[suff].cnt++;
return ;
}
t[cur].nxt[idx]=++num;
t[num].len=t[cur].len+2;
t[num].cnt++;
suff=num;
if(t[num].len==1){
t[num].suff=2;
return ;
}
while(true){
cur=t[cur].suff;
if(pos-t[cur].len-1>=0&&s[pos-t[cur].len-1]==s[pos])break;
}
t[num].suff=t[cur].nxt[idx];
t[t[num].suff].deg++;
}
void init(){
num=2,suff=2;
t[1].len=-1,t[1].suff=1;
t[2].len=0,t[2].suff=1;
}
int main(){
ios_base::sync_with_stdio(false);cin.tie(nullptr);
int i,a;
cin>>s;
init();
for(i=0;i<s.length();i++)add(i);
for(i=3;i<=num;i++)if(!t[i].deg)q.push(i);
while(!q.empty()){
a=q.front();
q.pop();
if(a<=2)continue;
t[t[a].suff].cnt+=t[a].cnt;
if(!--t[t[a].suff].deg)q.push(t[a].suff);
ans=max(ans,t[a].cnt*t[a].len);
}
cout<<ans;
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... |