………………
实在是太有教训意义了。
100分说没就没,第4变28,当场为校丢脸。
我的0分代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int MAXN=3333,mod=998244353;
char s[MAXN];
int l,n,fail[MAXN];
long long dp[MAXN][MAXN];
int main()
{
freopen("coin.in","r",stdin);
freopen("coin.out","w",stdout);
scanf("%s%d",s+1,&l),n=strlen(s+1);
for(int i=1;i<=n;i++)
{
dp[i][0]=1;
for(int j=i-1;j>=1;j--)
if(s[j]==s[i])
{
fail[i]=j;
break;
}
}
dp[0][0]=1;
for(int i=1;i<=n;i++)
for(int j=1;j<=l;j++)
dp[i][j]=((dp[i-1][j]+dp[i-1][j-1]-(fail[i]!=0)*dp[fail[i]-1][j-1])%mod+mod)%mod;
printf("%lld\n",dp[n][l]);
}
这是什么东西呢?
它不管fail[i]是不是0都会计算两个算式然后乘起来。
也就是说会爆内存。
本机上它分配了内存,所以对拍了一个小时没发现问题。
第4变28,当场为校丢脸。
以下是我的AC代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int MAXN=3333,mod=998244353;
char s[MAXN];
int l,n,fail[MAXN];
long long dp[MAXN][MAXN];
int main()
{
freopen("coin.in","r",stdin);
freopen("coin.out","w",stdout);
scanf("%s%d",s+1,&l),n=strlen(s+1);
for(int i=1;i<=n;i++)
{
dp[i][0]=1;
for(int j=i-1;j>=1;j--)
if(s[j]==s[i])
{
fail[i]=j;
break;
}
}
dp[0][0]=1;
for(int i=1;i<=n;i++)
for(int j=1;j<=l;j++)
dp[i][j]=((dp[i-1][j]+dp[i-1][j-1]-(fail[i]!=0?dp[fail[i]-1][j-1]:0)%mod)+mod)%mod;
printf("%lld\n",dp[n][l]);
}
有史以来最快的一篇博客。
这样的博客反而是最有意义的。