今天又一次挂大分,T3没文件读写
T1:
不难发现k进制下的一位数必定TDP,而个位为0则不TDP,所以若当前(n)必胜,稍加思索发现k就是n最小非因数。
T2:
研究性质发现对于不相同a,b,c,d,无法同时存在(a,b),(c,d),所以只有两种情况1.等腰三角。2.全部交于一点。
T3:
不难打出n n |s1| * |s2|的做法,对于不同的l,初值不同,但转移相同,所以钦定r,所有l一次做完。
#include<bits/stdc++.h>
#define int long long
#define mod 998244353
#define N 100010
#define L 25
using namespace std;
int n,l1,l2;
int dp[N][L][L];
char t[N],s1[N],s2[N];
signed main()
{
cin>>(t+1)>>(s1+1)>>(s2+1);
n=strlen(t+1);
l1=strlen(s1+1);
l2=strlen(s2+1);
for(int i=0;i<=n;i++)
{
dp[i][0][0]=1;
}
for(int i=1;i<=n;i++)
{
for(int j=l1;j>=0;j--)
{
for(int k=l2;k>=0;k--)
{
dp[i][j][k]=(dp[i][j][k]+dp[i-1][j][k])%mod;
if(t[i]==s1[j]&&j!=0) dp[i][j][k]=(dp[i][j][k]+dp[i-1][j-1][k])%mod;
if(t[i]==s2[k]&&k!=0) dp[i][j][k]=(dp[i][j][k]+dp[i-1][j][k-1])%mod;
if(t[i]==s1[j]&&t[i]==s2[k]&&j!=0&&k!=0) dp[i][j][k]=(dp[i][j][k]+dp[i-1][j-1][k-1])%mod;
}
}
}
int ans=0;
for(int i=1;i<=n;i++)
{
ans=(ans+dp[i][l1][l2])%mod;
}
cout<<ans;
return 0;
}
代码调到子闭