社区讨论

求助民间数据一塌糊涂

P8256[NOI Online 2022 入门组] 字符串参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@lo92m4l5
此快照首次捕获于
2023/10/28 04:33
2 年前
此快照最后确认于
2023/10/28 04:33
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
#define re register
#define MAXN 402
const int mod=1e9+7;
using namespace std;
namespace FastIO
{
	char buf[1<<23],*p1,*p2;
	#define reg register
	#define gc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<22,stdin),p1==p2))?EOF:*p1++
	inline int read()
    {
        reg int f=1,w=0;reg char ch=gc();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=gc();}
        while(ch>='0'&&ch<='9')w=w*10+ch-'0',ch=gc();
        return f*w;
    }
}
using namespace FastIO;
int T,n,m,ans,cnt,len;
int dp[MAXN][MAXN][MAXN];
char s[MAXN],r[MAXN],t[MAXN];
int main()
{
    // freopen("string.in","r",stdin);
    // freopen("string.out","w",stdout);
    T=read();
    while(T--)
    {
        n=read(),m=read(),ans=0;
        for(int i=1;i<=n;i++)s[i]=gc();
        gc();//吃掉换行符
        for(int i=1;i<=m;i++)t[i]=gc();
        cnt=0;
        for(int i=1;i<=n;i++)if(s[i]=='-')cnt++;
        if(n-cnt*2!=m){puts("0");continue;}
        len=0;
        memset(dp,0,sizeof(dp));
        dp[0][0][0]=1;
        for(int i=1;i<=n;i++)
        {
            if(s[i]=='-')len--;
            else len++;
            for(int j=0;j<=cnt;j++)
                for(int k=0;k<=cnt;k++)
                    if(s[i]=='-')
                        dp[i][j][k]=(dp[i-1][j+1][k]+dp[i-1][j][k+1])%mod;
                    else if(k>0)
                        dp[i][j][k]=dp[i-1][j][k-1];
                    else if(t[len-j]==s[i])
                        dp[i][j][k]=dp[i-1][j][k];
                    else if(len==j)
                        (dp[i][j][k]+=dp[i-1][j-1][k])%=mod;
        }
        printf("%d\n",dp[n][0][0]);
    }
    return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...