結果
問題 | No.765 ukuku 2 |
ユーザー |
![]() |
提出日時 | 2018-12-13 01:26:40 |
言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
結果 |
AC
|
実行時間 | 835 ms / 3,000 ms |
コード長 | 3,010 bytes |
コンパイル時間 | 886 ms |
コンパイル使用メモリ | 102,192 KB |
実行使用メモリ | 14,588 KB |
最終ジャッジ日時 | 2024-09-25 03:58:52 |
合計ジャッジ時間 | 13,412 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 48 |
ソースコード
#include <cstdio>#include <cstring>#include <iostream>#include <string>#include <cmath>#include <bitset>#include <vector>#include <map>#include <set>#include <queue>#include <deque>#include <algorithm>#include <complex>#include <unordered_map>#include <unordered_set>#include <random>using namespace std;typedef long long int ll;typedef pair<int, int> P;string s;int sa[400002], lcp[400002], rk[400002];int tmp[400002];int n, k;bool compare_sa(int i, int j){if(rk[i]!=rk[j]) return rk[i]<rk[j];else{int ri, rj;if(i+k<=n) ri=rk[i+k];else ri=-1;if(j+k<=n) rj=rk[j+k];else rj=-1;return ri<rj;}}void construct_sa(string s, int *sa){n=s.size();for(int i=0; i<=n; i++){sa[i]=i;if(i<n){rk[i]=s[i]-'a';}else{rk[i]=-1;}}for(k=1; k<=n; k*=2){sort(sa, sa+n+1, compare_sa);tmp[sa[0]]=0;for(int i=1; i<=n; i++){tmp[sa[i]]=tmp[sa[i-1]];if(compare_sa(sa[i-1], sa[i])) tmp[sa[i]]++;}for(int i=0; i<=n; i++) rk[i]=tmp[i];}}void construct_lcp(string s, int *sa, int *lcp){int n=s.size();for(int i=0; i<n; i++) rk[sa[i]]=i;int h=0;lcp[0]=0;for(int i=0; i<n; i++){int j=sa[rk[i]-1];if(h>0) h--;for(; j+h<n && i+h<n; h++){if(s[j+h]!=s[i+h]) break;}lcp[rk[i]-1]=h;}}const int MAX_N=1<<19;const int INF=1e9;int m0, mn[2*MAX_N];void init(int m_){m0=1;while(m0<m_) m0<<=1;for(int i=0; i<m_; i++){mn[m0+i]=lcp[i];}for(int i=m_+m0; i<=2*m0-1; i++) mn[i]=INF;for(int i=m0-1; i>=1; i--){mn[i]=min(mn[2*i], mn[2*i+1]);}}int query(int a, int b){a+=m0, b+=m0;int ans=INF;for(;a<b; a>>=1, b>>=1){if(b&1) ans=min(ans, mn[--b]);if(a&1) ans=min(ans, mn[a++]);}return ans;}int main(){cin>>s;int m=s.size();string t=s;reverse(t.begin(), t.end());s+='$'+t;construct_sa(s, sa);construct_lcp(s, sa, lcp);for(int i=0; i<=s.size(); i++) rk[sa[i]]=i;init(s.size()+1);int ans=0;for(int i=0; i<m; i++){int j=2*m-i;int l=query(min(rk[i], rk[j]), max(rk[i], rk[j]));if(i-l>=0 || i+l<=m-1) ans=max(ans, 2*l-1);else ans=max(ans, m-2);if(i-l>0 && s[i-l-1]==s[i+l]){int j1=2*m-(i-l-1);int l1=query(min(rk[j1], rk[i+l]), max(rk[i+l], rk[j1]));ans=max(ans, 2*l-1+2*l1);}if(i+l<m-1 && s[i-l]==s[i+l+1]){int j1=2*m-(i-l);int l1=query(min(rk[i+l+1], rk[j1]), max(rk[i+l+1], rk[j1]));ans=max(ans, 2*l-1+2*l1);}}for(int i=1; i<m; i++){int j=2*m-i+1;int l;if(s[i-1]!=s[i]){l=0;}else{l=query(min(rk[i], rk[j]), max(rk[i], rk[j]));}if(i-1-l>=0 || i+l<=m-1) ans=max(ans, 2*l);else ans=max(ans, m-2);if(i-l-1>0 && s[i-l-2]==s[i+l]){int j1=2*m-(i-l-2);int l1=query(min(rk[j1], rk[i+l]), max(rk[i+l], rk[j1]));ans=max(ans, 2*l+2*l1);}if(i+l<m-1 && s[i-l-1]==s[i+l+1]){int j1=2*m-(i-l-1);int l1=query(min(rk[i+l+1], rk[j1]), max(rk[i+l+1], rk[j1]));ans=max(ans, 2*l+2*l1);}}cout<<ans<<endl;return 0;}