結果

問題 No.765 ukuku 2
ユーザー chocoruskchocorusk
提出日時 2018-12-13 01:26:40
言語 C++11
(gcc 11.4.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
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 3 ms
9,548 KB
testcase_01 AC 3 ms
9,416 KB
testcase_02 AC 3 ms
9,552 KB
testcase_03 AC 3 ms
9,552 KB
testcase_04 AC 3 ms
9,672 KB
testcase_05 AC 3 ms
9,676 KB
testcase_06 AC 2 ms
9,552 KB
testcase_07 AC 3 ms
9,544 KB
testcase_08 AC 3 ms
9,672 KB
testcase_09 AC 3 ms
9,420 KB
testcase_10 AC 3 ms
9,676 KB
testcase_11 AC 2 ms
9,676 KB
testcase_12 AC 3 ms
9,676 KB
testcase_13 AC 3 ms
9,420 KB
testcase_14 AC 3 ms
9,544 KB
testcase_15 AC 3 ms
9,672 KB
testcase_16 AC 3 ms
9,548 KB
testcase_17 AC 3 ms
9,548 KB
testcase_18 AC 3 ms
9,556 KB
testcase_19 AC 2 ms
9,552 KB
testcase_20 AC 3 ms
9,420 KB
testcase_21 AC 3 ms
9,560 KB
testcase_22 AC 3 ms
9,680 KB
testcase_23 AC 3 ms
9,548 KB
testcase_24 AC 3 ms
9,676 KB
testcase_25 AC 3 ms
9,676 KB
testcase_26 AC 3 ms
9,424 KB
testcase_27 AC 3 ms
9,556 KB
testcase_28 AC 3 ms
9,428 KB
testcase_29 AC 3 ms
9,684 KB
testcase_30 AC 501 ms
13,920 KB
testcase_31 AC 474 ms
13,900 KB
testcase_32 AC 398 ms
13,856 KB
testcase_33 AC 501 ms
14,508 KB
testcase_34 AC 507 ms
14,556 KB
testcase_35 AC 826 ms
14,588 KB
testcase_36 AC 835 ms
14,544 KB
testcase_37 AC 510 ms
14,508 KB
testcase_38 AC 540 ms
14,520 KB
testcase_39 AC 636 ms
14,512 KB
testcase_40 AC 471 ms
13,972 KB
testcase_41 AC 574 ms
14,072 KB
testcase_42 AC 605 ms
14,256 KB
testcase_43 AC 538 ms
13,944 KB
testcase_44 AC 521 ms
14,060 KB
testcase_45 AC 610 ms
14,160 KB
testcase_46 AC 501 ms
14,036 KB
testcase_47 AC 574 ms
14,380 KB
testcase_48 AC 581 ms
14,468 KB
testcase_49 AC 581 ms
14,348 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#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;
}
0