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

原题链接

预处理
处理满足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 131
using 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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值