結果
問題 | No.465 PPPPPPPPPPPPPPPPAPPPPPPPP |
ユーザー |
|
提出日時 | 2016-12-17 19:58:48 |
言語 | C90 (gcc 12.3.0) |
結果 |
AC
|
実行時間 | 88 ms / 2,000 ms |
コード長 | 2,810 bytes |
コンパイル時間 | 679 ms |
コンパイル使用メモリ | 25,088 KB |
実行使用メモリ | 25,344 KB |
最終ジャッジ日時 | 2024-12-23 15:09:24 |
合計ジャッジ時間 | 2,652 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 20 |
コンパイルメッセージ
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]==str[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;}