[UOJ P219][NOI2016]优秀的拆分[95]

来源:互联网 发布:华为追风软件 编辑:程序博客网 时间:2024/06/06 03:13

原题链接

预处理
处理满足AA形式的字串
记录在i这个位置
以它为开头的AA形式和以它为结尾的AA形式的字串的个数

#include<iostream>#include<cstring>#include<algorithm>#include<cstdio>#include<cmath>#include<queue>#include<vector>#include<climits>#include<string>#include<cstdlib>#include<ctime>#define ULL unsigned long long#define LL long long#define MOD1 1000000007#define MOD2 23333333333#define base 131using namespace std;char s[2005];int T,f1[2005][2005],f2[2005][2005],len,mid,ans,f[2005],g[2005];void pre(){    int i,j;    memset(f1,0,sizeof(f1));    memset(f2,0,sizeof(f2));    for(i=1;i<=len;i++)        for(j=i;j<=len;j++)        {            f1[i][j]=(f1[i][j-1]*base+s[j]-'a'+1)%MOD1;            f2[i][j]=(f2[i][j-1]*base+s[j]-'a'+1)%MOD2;                 }   }int main(){    int i,j;    scanf("%d",&T);    while(T--)    {        scanf("%s",s);        len=strlen(s);              for(i=len;i>=1;i--)            s[i]=s[i-1];        s[0]=0;        ans=0;        memset(f,0,sizeof(f));        memset(g,0,sizeof(g));              pre();        for(i=1;i<=len;i++)            for(j=i+1;j<=len;j++)                if((j-i+1)%2==0)                {                    mid=(i+j)>>1;                    if((f1[mid+1][j]==f1[i][mid])&&(f2[mid+1][j]==f2[i][mid]))                     {                        f[i]++;                        g[j]++;                     }                }        for(i=1;i<=len;i++)            if(f[i+1]&&g[i]) ans+=f[i+1]*g[i];        printf("%d\n",ans);    }    return 0;}219
原创粉丝点击