結果
問題 | No.465 PPPPPPPPPPPPPPPPAPPPPPPPP |
ユーザー | Yamyuki |
提出日時 | 2016-12-17 19:25:15 |
言語 | C90 (gcc 11.4.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 2,804 bytes |
コンパイル時間 | 416 ms |
コンパイル使用メモリ | 25,236 KB |
実行使用メモリ | 27,288 KB |
最終ジャッジ日時 | 2024-05-08 04:11:57 |
合計ジャッジ時間 | 2,319 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
11,748 KB |
testcase_01 | WA | - |
testcase_02 | WA | - |
testcase_03 | WA | - |
testcase_04 | AC | 2 ms
11,752 KB |
testcase_05 | WA | - |
testcase_06 | AC | 43 ms
25,148 KB |
testcase_07 | WA | - |
testcase_08 | WA | - |
testcase_09 | WA | - |
testcase_10 | WA | - |
testcase_11 | WA | - |
testcase_12 | WA | - |
testcase_13 | AC | 41 ms
22,248 KB |
testcase_14 | WA | - |
testcase_15 | AC | 50 ms
25,188 KB |
testcase_16 | WA | - |
testcase_17 | WA | - |
testcase_18 | WA | - |
testcase_19 | WA | - |
testcase_20 | WA | - |
testcase_21 | WA | - |
32_ratsliveonnoevilstar.txt | WA | - |
コンパイルメッセージ
main.c: In function ‘main’: main.c:65:17: warning: implicit declaration of function ‘memset’ [-Wimplicit-function-declaration] 65 | memset(ns,0,sizeof(ns)); | ^~~~~~ main.c:4:1: note: include ‘<string.h>’ or provide a declaration of ‘memset’ 3 | #include<limits.h> +++ |+#include <string.h> 4 | main.c:65:17: warning: incompatible implicit declaration of built-in function ‘memset’ [-Wbuiltin-declaration-mismatch] 65 | memset(ns,0,sizeof(ns)); | ^~~~~~ main.c:65:17: note: include ‘<string.h>’ or provide a declaration of ‘memset’ main.c:113:17: warning: implicit declaration of function ‘memcpy’ [-Wimplicit-function-declaration] 113 | memcpy(start,ns,sizeof(ns)); | ^~~~~~ main.c:113:17: note: include ‘<string.h>’ or provide a declaration of ‘memcpy’ main.c:113:17: warning: incompatible implicit declaration of built-in function ‘memcpy’ [-Wbuiltin-declaration-mismatch] main.c:113:17: note: include ‘<string.h>’ or provide a declaration of ‘memcpy’
ソースコード
#include<stdio.h> #include<stdlib.h> #include<limits.h> #define min(a,b) ((a)<(b)?(a):(b)) #define max(a,b) ((a)>(b)?(a):(b)) long n; char str[500001]; long s[1000000]; long b[500000]; long start[32],ns[32]; long delta[32],nd[32]; long num[32],nn[32]; long pre[500000],suf[500000]; long ep[500000],dp[500000]; void manacher(void){ long i=0,j=0,k; while(i<n*2){ while(i-j>=0 && i+j+1<n*2 && str[(i-j)/2]==str[(i+j+1)/2]){ j++; } s[i]=j; k=1; while(i-k>=0 && s[i]-k>=0 && s[i-k]!=s[i]-k){ s[i+k]=min(s[i-k],s[i]-k); k++; } i+=k; j=max(j-k,0); } } int main(){ long i,I,g,g1,g2,g3,j,lv,r; long long ans=0; str[0]=getchar(); n=0; while(str[n]!='\n'){ n++; str[n]=getchar(); } manacher(); for(i=0;i<n;i++){ if(s[i]==i+1){ pre[i]=1; } } I=LONG_MAX; g=0; for(i=0;i<n;i++){ //printf("loop %ld\n",i); g1=0; for(j=0;j<g;j++){ if(start[j]-1>=0 && str[start[j]-1]==str[i]){ //printf("cont s: %ld d: %ld n: %ld \n",start[j]-1,delta[j],num[j]); start[j]--; start[g1]=start[j]; delta[g1]=delta[j]; num[g1]=num[j]; g1++; } } memset(ns,0,sizeof(ns)); memset(nd,0,sizeof(nd)); memset(nn,0,sizeof(nn)); g2=0; for(j=0;j<g1;j++){ if((j==0 && delta[j]==I) || (g2-1>=0 && ns[g2-1]+nd[g2-1]*(nn[g2-1]-1)==start[j]-delta[j])){ ns[g2]=start[j]; nd[g2]=delta[j]; nn[g2]=num[j]; g2++; continue; } ns[g2]=start[j]; nd[g2]=(g2==0)?I:start[j]-(ns[g2-1]+nd[g2-1]*(nn[g2-1]-1)); nn[g2]=1; g2++; if(num[j]>1){ ns[g2]=start[j]+delta[j]; nd[g2]=delta[j]; nn[g2]=num[j]-1; g2++; } } if(i-1>=0 && str[i-1]==s[i]){ ns[g2]=i-1; nd[g2]=(0<g2)?i-1-(ns[g2-1]+nd[g2-1]*(nn[g2-1]-1)):I; nn[g2]=1; g2++; } //printf("add %ld s: %ld d: %ld n: 1\n",g2,i,(0<g2)?i-(ns[g2-1]+nd[g2-1]*(nn[g2-1]-1)):I); ns[g2]=i; nd[g2]=(0<g2)?i-(ns[g2-1]+nd[g2-1]*(nn[g2-1]-1)):I; nn[g2]=1; g2++; g3=0; for(j=0;j<g2;j++){ if(j==0 || nd[j]!=nd[j-1]){ //printf("%ld s: %ld d: %ld n: %ld\n",g3,ns[j],nd[j],nn[j]); ns[g3]=ns[j]; nd[g3]=nd[j]; nn[g3]=nn[j]; g3++; }else{ //printf("merge %ld\n",g3-1); nn[g3-1]+=nn[j]; } } memcpy(start,ns,sizeof(ns)); memcpy(delta,nd,sizeof(nd)); memcpy(num,nn,sizeof(nn)); g=g3; for(j=0;j<g;j++){ r=start[j]+delta[j]*(num[j]-1); lv=0; if(r-1>=0) lv+=pre[r-1]; if(num[j]>1 && start[j]-delta[j]>=0){ lv+=ep[start[j]-delta[j]]; } //printf("%ld\n",lv); dp[i]+=lv; if(delta[j]<=start[j]){ ep[start[j]-delta[j]]=lv; } } //printf("g %ld\n",g); } for(i=0;i<n;i++){ if(s[n*2-2-i]==i+1){ suf[n-1-i]=1; } } for(i=1;i<n;i++){ suf[n-1-i]+=suf[n-i]; } for(i=0;i<n-2;i++){ ans+=(long long)dp[i]*(long long)suf[i+2]; } printf("%lld\n",ans); return 0; }