无聊做下比赛。并没有报名,只是帮别人做做而已
最终他A了2题然后顺利前20
最开始以为位置不同算多种,心想这不是SB的DP题嘛,然后发现第二个输出WA掉了= =
然后想到的是既比较那啥的做法,用后缀数组做lcp,然后直接处理答案,显然可以但是代码量稍微有点大
然后wxy怒水hash过掉了,然而并没有卡hash技术高的人出现在他的房间里面,然后就A掉了
看起来Chais老司机的做法应该也是裸hash,似乎并没有多少人写了正解
我们显然可以做马拉车,然后hash判重
还有就是如上面那样高贵的后缀数组,后缀自动机,或者是回文树做法
Problem : 5658 ( CA Loves Palindromic ) Judge Status : Accepted RunId : 16761359 Language : G++ Author : BPMThor Code Render Status : Rendered By HDOJ G++ Code Render Version 0.01 Beta /* *********************************************** Author :BPM136 Created Time :2016-4-3 16:41:38 File Name :F:\2016-4-3\BCT3\A.cpp ************************************************ */ #include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> #include<vector> #include<queue> #include<set> #include<map> #include<string> #include<math.h> #include<stdlib.h> #include<time.h> #include<bitset> #define LL long long #define fo(i,a,b) for(int i=a;i<=b;i++) #define fd(i,a,b) for(int i=a;i>=b;i--) #define efo(i,x) for(int i=last[x];i!=0;i=e[i].next) using namespace std; LL read() { LL d=0,f=1;char s=getchar(); while(s<48||s>57){if(s==45)f=-1;s=getchar();} while(s>=48&&s<=57){d=d*10+s-48;s=getchar();} return d*f; } #define N 1005 #define MOD 32135131 int f[N][N],g[N][N]; int F[N]; int Ans[N][N]; bitset<MOD+2>v; char str[N]; int n; int main() { //freopen(".in","r",stdin); //freopen(".out","w",stdout); int T=read(); while(T--) { scanf("%s",str+1); n=strlen(str+1); // memset(f,0,sizeof(f)); // memset(g,0,sizeof(g)); fo(i,1,n) { f[i][i-1]=0; fo(j,i,n) { f[i][j]=((LL)f[i][j-1]*27+(str[j]-'a')+1)%MOD; } } fo(i,1,n) { g[i][i+1]=0; fd(j,i,1) { g[i][j]=((LL)g[i][j+1]*27+(str[j]-'a')+1)%MOD; } } fd(i,n,1) { Ans[i][i+1]=0; fo(j,i,n) { if(f[i][j]==g[j][i])F[j]=f[i][j]; if(v[F[j]]==0) { v[F[j]]=1; Ans[i][j]=Ans[i][j-1]+1; }else Ans[i][j]=Ans[i][j-1]; } fo(j,i,n)v[F[j]]=0; } /* fo(i,1,n) { fo(j,i,n) cout<<Ans[i][j]<<' '; cout<<endl; } */ int Q=read(); while(Q--) { int l=read(),r=read(); printf("%d\n",Ans[l][r]); } } return 0; }