题解:AT_ndpc2026_c 文字列
题意概述:
给你三个由小写字母构成的字符串
不难发现,这几个串串的长度都挺小,于是直接暴力 dp。
设
一下简称
那么由
-
-
匹配
s_1 ,不匹配s_2,s_3 ,当且仅当s_{1,a+1}\ne s_{2,b+1} 且s_{1,a+1}\ne s_{3,c+1} ,则:
- 匹配
s_2 ,不匹配s_1,s_3 ,当且仅当s_{2,b+1}\ne s_{1,a+1} 且s_{2,b+1}\ne s_{3,c+1} ,则:
- 匹配
s_3 ,不匹配s_1,s_2 ,当且仅当s_{3,c+1}\ne s_{1,a+1} 且s_{3,c+1}\ne s_{2,b+1} ,则:
- 匹配
s_1,s_2 ,不匹配s_3 ,当且仅当s_{1,a+1}=s_{2,b+1} 且s_{1,a+1}\ne s_{3,c+1} ,则:
- 匹配
s_1,s_3 ,不匹配s_2 ,当且仅当s_{1,a+1}=s_{3,c+1} 且s_{1,a+1}\ne s_{2,b+1} ,则:
- 匹配
s_2,s_3 ,不匹配s_1 ,当且仅当s_{2,b+1}=s_{3,c+1} 且s_{2,b+1}\ne s_{1,a+1} ,则:
- 匹配
s_1,s_2,s_3 ,当且仅当s_{1,a+1}=s_{2,b+1} 且s_{2,b+1}=s_{3,c+1} ,则:
为了不能完整匹配到,最终答案应为
代码如下:
const int N=1001,M=11,mod=998244353;
int n,cnt,l[4];
char s[4][M];
long long ans,f[N][M][M][M];
int main()
{
n=read();
for(int i=1;i<=3;i++) scanf("%s",s[i]+1),l[i]=strlen(s[i]+1);
f[0][0][0][0]=1;
for(int i=0;i<n;i++)
{
for(int a=0;a<l[1];a++)
{
for(int b=0;b<l[2];b++)
{
for(int c=0;c<l[3];c++)
{
//不匹配s1,s2,s3
cnt=1;
if(s[1][a+1]!=s[2][b+1]) cnt++;
if(s[1][a+1]!=s[3][c+1]&&s[2][b+1]!=s[3][c+1]) cnt++;
f[i+1][a][b][c]=(f[i+1][a][b][c]+f[i][a][b][c]*(26-cnt))%mod;
//匹配s1,不匹配s2,s3
if(s[1][a+1]!=s[2][b+1]&&s[1][a+1]!=s[3][c+1])
f[i+1][a+1][b][c]=(f[i+1][a+1][b][c]+f[i][a][b][c])%mod;
//匹配s2,不匹配s1,s3
if(s[2][b+1]!=s[1][a+1]&&s[2][b+1]!=s[3][c+1])
f[i+1][a][b+1][c]=(f[i+1][a][b+1][c]+f[i][a][b][c])%mod;
//匹配s3,不匹配s1,s2
if(s[3][c+1]!=s[1][a+1]&&s[3][c+1]!=s[2][b+1])
f[i+1][a][b][c+1]=(f[i+1][a][b][c+1]+f[i][a][b][c])%mod;
//匹配s1,s2,不匹配s3
if(s[1][a+1]==s[2][b+1]&&s[1][a+1]!=s[3][c+1])
f[i+1][a+1][b+1][c]=(f[i+1][a+1][b+1][c]+f[i][a][b][c])%mod;
//匹配s1,s3,不匹配s2
if(s[1][a+1]==s[3][c+1]&&s[1][a+1]!=s[2][b+1])
f[i+1][a+1][b][c+1]=(f[i+1][a+1][b][c+1]+f[i][a][b][c])%mod;
//匹配s2,s3,不匹配s1
if(s[2][b+1]==s[3][c+1]&&s[2][b+1]!=s[1][a+1])
f[i+1][a][b+1][c+1]=(f[i+1][a][b+1][c+1]+f[i][a][b][c])%mod;
//匹配s1,s2,s3
if(s[1][a+1]==s[2][b+1]&&s[2][b+1]==s[3][c+1])
f[i+1][a+1][b+1][c+1]=(f[i+1][a+1][b+1][c+1]+f[i][a][b][c])%mod;
}
}
}
}
for(int a=0;a<l[1];a++)
for(int b=0;b<l[2];b++)
for(int c=0;c<l[3];c++)
ans=(ans+f[n][a][b][c])%mod;
print(ans);
return 0;
}