提出 #7547348
ソースコード 拡げる
#pragma GCC optimize ("Ofast")
#include<bits/stdc++.h>
using namespace std;
void *wmem;
char memarr[96000000];
template<class T> inline void walloc1d(T **arr, int x, void **mem = &wmem){
static int skip[16] = {0, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
(*mem) = (void*)( ((char*)(*mem)) + skip[((unsigned long long)(*mem)) & 15] );
(*arr)=(T*)(*mem);
(*mem)=((*arr)+x);
}
inline void rd(int &x){
int k;
int m=0;
x=0;
for(;;){
k = getchar_unlocked();
if(k=='-'){
m=1;
break;
}
if('0'<=k&&k<='9'){
x=k-'0';
break;
}
}
for(;;){
k = getchar_unlocked();
if(k<'0'||k>'9'){
break;
}
x=x*10+k-'0';
}
if(m){
x=-x;
}
}
inline void rd(char &c){
int i;
for(;;){
i = getchar_unlocked();
if(i!=' '&&i!='\n'&&i!='\r'&&i!='\t'&&i!=EOF){
break;
}
}
c = i;
}
inline int rd(char c[]){
int i;
int sz = 0;
for(;;){
i = getchar_unlocked();
if(i!=' '&&i!='\n'&&i!='\r'&&i!='\t'&&i!=EOF){
break;
}
}
c[sz++] = i;
for(;;){
i = getchar_unlocked();
if(i==' '||i=='\n'||i=='\r'||i=='\t'||i==EOF){
break;
}
c[sz++] = i;
}
c[sz]='\0';
return sz;
}
inline void wt_L(char a){
putchar_unlocked(a);
}
inline void wt_L(int x){
int s=0;
int m=0;
char f[10];
if(x<0){
m=1;
x=-x;
}
while(x){
f[s++]=x%10;
x/=10;
}
if(!s){
f[s++]=0;
}
if(m){
putchar_unlocked('-');
}
while(s--){
putchar_unlocked(f[s]+'0');
}
}
template<class S, class T> inline S chmin(S &a, T b){
if(a>b){
a=b;
}
return a;
}
template<class S, class T> inline S chmax(S &a, T b){
if(a<b){
a=b;
}
return a;
}
template<class T> void SuffixArray(T *s, int N, int K, int *SA, int *LCP = NULL, void *mem = wmem){
int i;
int j;
int d;
int m;
int *s1;
int name;
int prev;
int pos;
char *t;
char *lms;
int *cnt;
int *cnt1;
int *cnt2;
walloc1d(&t, N+1, &mem);
walloc1d(&lms, N+1, &mem);
walloc1d(&cnt, K+1, &mem);
walloc1d(&cnt1, K+1, &mem);
walloc1d(&cnt2, K+1, &mem);
N++;
s[N-1] = 0;
t[N-1] = 1;
t[N-2] = 0;
for(i=N-3;i>=0;i--){
if(s[i] < s[i+1] || (s[i]==s[i+1] && t[i+1])){
t[i] = 1;
}
else{
t[i] = 0;
}
}
lms[0] = 0;
for(i=(1);i<(N);i++){
if(t[i] && !t[i-1]){
lms[i] = 1;
}
else{
lms[i] = 0;
}
}
for(i=0;i<(K+1);i++){
cnt1[i] = 0;
}
for(i=0;i<(N);i++){
cnt1[s[i]]++;
}
j = 0;
for(i=0;i<(K+1);i++){
j += cnt1[i];
cnt2[i] = j - cnt1[i];
cnt1[i] = j;
}
for(i=0;i<(K+1);i++){
cnt[i] = cnt1[i];
}
for(i=0; i<N; i++){
SA[i] = -1;
}
for(i=1; i<N; i++){
if(lms[i]){
SA[--cnt[s[i]]]=i;
}
}
for(i=0;i<(K+1);i++){
cnt[i] = cnt2[i];
}
for(i=0;i<(N);i++){
j = SA[i]-1;
if(j>=0 && !t[j]){
SA[cnt[s[j]]++] = j;
}
}
for(i=0;i<(K+1);i++){
cnt[i] = cnt1[i];
}
for(i=N-1;i>=0;i--){
j = SA[i] - 1;
if(j>=0 && t[j]){
SA[--cnt[s[j]]] = j;
}
}
m = 0;
for(i=0;i<(N);i++){
if(lms[SA[i]]){
SA[m++] = SA[i];
}
}
for(i=(m);i<(N);i++){
SA[i] = -1;
}
name=0;
prev=-1;
for(i=0;i<(m);i++){
pos = SA[i];
for(d=0;d<(N);d++){
if(prev==-1 || s[pos+d]!=s[prev+d] || t[pos+d]!=t[prev+d]){
name++;
prev=pos;
break;
}
else if(d>0 && (lms[pos+d] || lms[prev+d])){
break;
}
}
pos /= 2;
SA[m+pos]=name-1;
}
for(i=N-1, j=N-1; i>=m; i--){
if(SA[i]>=0){
SA[j--]=SA[i];
}
}
s1 = SA+N-m;
if(name<m){
SuffixArray(s1, m-1, name-1, SA, NULL, mem);
}
else{
for(i=0; i<m; i++){
SA[s1[i]] = i;
}
}
for(i=0;i<(K+1);i++){
cnt[i] = cnt1[i];
}
for(i=1, j=0; i<N; i++){
if(lms[i]){
s1[j++]=i;
}
}
for(i=0; i<m; i++){
SA[i]=s1[SA[i]];
}
for(i=m; i<N; i++){
SA[i]=-1;
}
for(i=m-1; i>=0; i--){
j=SA[i];
SA[i]=-1;
SA[--cnt[s[j]]]=j;
}
for(i=0;i<(N);i++){
j = SA[i]-1;
if(j>=0 && !t[j]){
SA[cnt2[s[j]]++] = j;
}
}
for(i=N-1;i>=0;i--){
j = SA[i] - 1;
if(j>=0 && t[j]){
SA[--cnt1[s[j]]] = j;
}
}
if(LCP != NULL){
cnt = (int*)t;
d = 0;
for(i=0;i<(N);i++){
cnt[SA[i]] = i;
}
for(i=0;i<(N);i++){
if(cnt[i]){
for(j=SA[cnt[i]-1]; j+d<N-1&&i+d<N-1&&s[j+d]==s[i+d];d++){
;
}
LCP[cnt[i]]=d;
}
else{
LCP[cnt[i]] = -1;
}
if(d>0){
d--;
}
}
}
}
int N;
char S[5002];
int SA[5002];
int LCP[5002];
int main(){
wmem = memarr;
int i;
int j;
int ok;
int mn;
int mx;
int res = 0;
rd(N);
rd(S);
SuffixArray(S, N, 128, SA, LCP);
int Lj4PdHRW;
int KL2GvlyY;
int Q5VJL1cS;
Lj4PdHRW = 0;
KL2GvlyY = N/2;
while(Lj4PdHRW < KL2GvlyY){
if((Lj4PdHRW + KL2GvlyY)%2==0){
Q5VJL1cS = (Lj4PdHRW + KL2GvlyY) / 2;
}
else{
Q5VJL1cS = (Lj4PdHRW + KL2GvlyY + 1) / 2;
}
ok = 0;
i = 1;
while(i < N+1){
j = i;
mn = mx = SA[i];
while(j+1 < N+1 && LCP[j+1] >= Q5VJL1cS){
j++;
chmin(mn, SA[j]);
chmax(mx, SA[j]);
}
if(mx - mn >= Q5VJL1cS){
ok = 1;
break;
}
i = j + 1;
}
if(ok){
Lj4PdHRW = Q5VJL1cS;
}
else{
KL2GvlyY = Q5VJL1cS - 1;
}
}
res =KL2GvlyY;
wt_L(res);
wt_L('\n');
return 0;
}
// cLay varsion 20190914-1
// --- original code ---
// int N;
// char S[5002];
//
// int SA[5002], LCP[5002];
// {
// int i, j, ok, mn, mx;
// int res = 0;
// rd(N,S);
// SuffixArray(S, N, 128, SA, LCP);
// res = bsearch_max[int,x,0,N/2][
// ok = 0;
// i = 1;
// while(i < N+1){
// j = i;
// mn = mx = SA[i];
// while(j+1 < N+1 && LCP[j+1] >= x){
// j++;
// mn <?= SA[j];
// mx >?= SA[j];
// }
// if(mx - mn >= x) ok = 1, break;
// i = j + 1;
// }
// ](ok);
// wt(res);
// }
提出情報
| 提出日時 | |
|---|---|
| 問題 | E - Who Says a Pun? |
| ユーザ | LayCurse |
| 言語 | C++14 (GCC 5.4.1) |
| 得点 | 500 |
| コード長 | 6049 Byte |
| 結果 | AC |
| 実行時間 | 2 ms |
| メモリ | 384 KiB |
ジャッジ結果
| セット名 | Sample | All | ||||
|---|---|---|---|---|---|---|
| 得点 / 配点 | 0 / 0 | 500 / 500 | ||||
| 結果 |
|
|
| セット名 | テストケース |
|---|---|
| Sample | 00-sample-00, 00-sample-01, 00-sample-02 |
| All | 00-sample-00, 00-sample-01, 00-sample-02, 01-handmade-03, 01-handmade-04, 01-handmade-05, 01-handmade-06, 01-handmade-07, 01-handmade-08, 01-handmade-09, 01-handmade-10, 01-handmade-11, 01-handmade-12, 02-binary-13, 02-binary-14, 02-binary-15, 02-binary-16, 02-binary-17, 02-binary-18, 02-binary-19, 02-binary-20, 02-binary-21, 02-binary-22, 02-binary-23, 03-BigRandom-24, 03-BigRandom-25, 03-BigRandom-26, 03-BigRandom-27, 03-BigRandom-28, 03-BigRandom-29, 03-BigRandom-30, 03-BigRandom-31, 03-BigRandom-32, 03-BigRandom-33, 03-BigRandom-34, 03-BigRandom-35, 03-BigRandom-36, 03-BigRandom-37, 03-BigRandom-38, 03-BigRandom-39, 03-BigRandom-40, 03-BigRandom-41, 03-BigRandom-42, 03-BigRandom-43, 03-BigRandom-44, 03-BigRandom-45, 03-BigRandom-46, 03-BigRandom-47, 03-BigRandom-48, 03-BigRandom-49, 03-BigRandom-50, 03-BigRandom-51, 03-BigRandom-52, 03-BigRandom-53, 03-BigRandom-54, 04-zero-55, 04-zero-56, 05-AllRandom-57, 05-AllRandom-58, 05-AllRandom-59, 05-AllRandom-60, 05-AllRandom-61, 05-AllRandom-62, 05-AllRandom-63, 05-AllRandom-64, 05-AllRandom-65, 05-AllRandom-66, 05-AllRandom-67, 05-AllRandom-68, 05-AllRandom-69 |
| ケース名 | 結果 | 実行時間 | メモリ |
|---|---|---|---|
| 00-sample-00 | AC | 1 ms | 256 KiB |
| 00-sample-01 | AC | 1 ms | 256 KiB |
| 00-sample-02 | AC | 1 ms | 256 KiB |
| 01-handmade-03 | AC | 1 ms | 256 KiB |
| 01-handmade-04 | AC | 1 ms | 256 KiB |
| 01-handmade-05 | AC | 1 ms | 256 KiB |
| 01-handmade-06 | AC | 1 ms | 256 KiB |
| 01-handmade-07 | AC | 1 ms | 256 KiB |
| 01-handmade-08 | AC | 1 ms | 256 KiB |
| 01-handmade-09 | AC | 1 ms | 256 KiB |
| 01-handmade-10 | AC | 1 ms | 256 KiB |
| 01-handmade-11 | AC | 1 ms | 256 KiB |
| 01-handmade-12 | AC | 1 ms | 256 KiB |
| 02-binary-13 | AC | 2 ms | 256 KiB |
| 02-binary-14 | AC | 2 ms | 256 KiB |
| 02-binary-15 | AC | 1 ms | 256 KiB |
| 02-binary-16 | AC | 2 ms | 256 KiB |
| 02-binary-17 | AC | 2 ms | 256 KiB |
| 02-binary-18 | AC | 2 ms | 256 KiB |
| 02-binary-19 | AC | 1 ms | 256 KiB |
| 02-binary-20 | AC | 1 ms | 256 KiB |
| 02-binary-21 | AC | 1 ms | 256 KiB |
| 02-binary-22 | AC | 1 ms | 256 KiB |
| 02-binary-23 | AC | 1 ms | 256 KiB |
| 03-BigRandom-24 | AC | 1 ms | 384 KiB |
| 03-BigRandom-25 | AC | 1 ms | 256 KiB |
| 03-BigRandom-26 | AC | 1 ms | 256 KiB |
| 03-BigRandom-27 | AC | 2 ms | 384 KiB |
| 03-BigRandom-28 | AC | 2 ms | 384 KiB |
| 03-BigRandom-29 | AC | 2 ms | 384 KiB |
| 03-BigRandom-30 | AC | 1 ms | 384 KiB |
| 03-BigRandom-31 | AC | 1 ms | 256 KiB |
| 03-BigRandom-32 | AC | 2 ms | 384 KiB |
| 03-BigRandom-33 | AC | 2 ms | 384 KiB |
| 03-BigRandom-34 | AC | 1 ms | 256 KiB |
| 03-BigRandom-35 | AC | 2 ms | 256 KiB |
| 03-BigRandom-36 | AC | 2 ms | 384 KiB |
| 03-BigRandom-37 | AC | 1 ms | 256 KiB |
| 03-BigRandom-38 | AC | 2 ms | 384 KiB |
| 03-BigRandom-39 | AC | 2 ms | 384 KiB |
| 03-BigRandom-40 | AC | 2 ms | 384 KiB |
| 03-BigRandom-41 | AC | 2 ms | 256 KiB |
| 03-BigRandom-42 | AC | 2 ms | 384 KiB |
| 03-BigRandom-43 | AC | 1 ms | 384 KiB |
| 03-BigRandom-44 | AC | 1 ms | 384 KiB |
| 03-BigRandom-45 | AC | 2 ms | 384 KiB |
| 03-BigRandom-46 | AC | 1 ms | 256 KiB |
| 03-BigRandom-47 | AC | 2 ms | 384 KiB |
| 03-BigRandom-48 | AC | 1 ms | 256 KiB |
| 03-BigRandom-49 | AC | 2 ms | 384 KiB |
| 03-BigRandom-50 | AC | 2 ms | 384 KiB |
| 03-BigRandom-51 | AC | 1 ms | 256 KiB |
| 03-BigRandom-52 | AC | 2 ms | 384 KiB |
| 03-BigRandom-53 | AC | 2 ms | 384 KiB |
| 03-BigRandom-54 | AC | 2 ms | 384 KiB |
| 04-zero-55 | AC | 1 ms | 256 KiB |
| 04-zero-56 | AC | 1 ms | 256 KiB |
| 05-AllRandom-57 | AC | 2 ms | 384 KiB |
| 05-AllRandom-58 | AC | 2 ms | 256 KiB |
| 05-AllRandom-59 | AC | 2 ms | 384 KiB |
| 05-AllRandom-60 | AC | 2 ms | 384 KiB |
| 05-AllRandom-61 | AC | 2 ms | 384 KiB |
| 05-AllRandom-62 | AC | 2 ms | 256 KiB |
| 05-AllRandom-63 | AC | 2 ms | 384 KiB |
| 05-AllRandom-64 | AC | 2 ms | 384 KiB |
| 05-AllRandom-65 | AC | 2 ms | 384 KiB |
| 05-AllRandom-66 | AC | 2 ms | 384 KiB |
| 05-AllRandom-67 | AC | 2 ms | 384 KiB |
| 05-AllRandom-68 | AC | 2 ms | 384 KiB |
| 05-AllRandom-69 | AC | 2 ms | 384 KiB |