1 条题解

  • 1
    @ 2022-8-27 9:08:48
    #include<bits/stdc++.h>
    using namespace std;
    int read()
    {
        char s;
        int k=0,base=1;
        while((s=getchar())!='-'&&s!=EOF&&!(s>='0'&&s<='9'));
        if(s==EOF)exit(0);
        if(s=='-')base=-1,s=getchar();
        while(s>='0'&&s<='9')
        {
            k=k*10+(s-'0');
            s=getchar();
        }
        return k*base;
    }
    void write(int x)
    {
        if(x<0)
        {
            putchar('-');
            write(-x);
        }
        else
        {
            if(x/10)write(x/10);
            putchar(x%10+'0');
        }
    }
    int n,m;
    char a[510],b[510];
    int f[5][510][510],t;//滚动数组
    inline void add(int A,int &B)
    {
        B+=A;
        if (B>1024523) B-=1024523;//取膜
    }
    int cur=0;
    int main()
    {
        n=read();m=read();
        scanf("%s",a+1);
        scanf("%s",b+1);
        f[0][0][0]=1;
        for (int i=0;i<=n;i++,cur^=1)
            for (int j=0;j<=m;j++)
                for (int k=0;k<=n;k++)
                {
                    t=f[cur][j][k];
                    if (i+j-k>m||i+j-k<0) continue;//越界退出
                    if (a[i+1]==a[k+1]) add(t,f[cur^1][j][k+1]);//状态转移
                    if (b[j+1]==b[i+j-k+1]) add(t,f[cur][j+1][k]);
                    if (a[i+1]==b[i+j-k+1]) add(t,f[cur^1][j][k]);
                    if (b[j+1]==a[k+1]) add(t,f[cur][j+1][k+1]);
                    f[cur][j][k]=0;//清掉
                }
        printf("%d",f[cur][m][n]);
        return 0;
    }
    
    • 1

    信息

    ID
    1566
    时间
    1000ms
    内存
    256MiB
    难度
    8
    标签
    (无)
    递交数
    15
    已通过
    6
    上传者