KMP,预处理nxt,然后去文本串中匹配,f[i]表示前i个字母有多少种意思,当匹配到i成功时,说明i-len+1.....i可以表达为2种意思,所以f[i]=f[i-1]+f[i-len]。想了许久,暴露了我的sb智商
#include<cstdio>
#include<cstring>
#define maxl 100010
#define mod 1000000007
int cas,tlen,slen;
int f[maxl],nxt[maxl];
char t[maxl],s[maxl];
void getnxt()
{
int j=0;nxt[1]=0;
for(int i=2;i<=tlen;i++)
{
while(j && t[j+1]!=t[i])
j=nxt[j];
if(t[j+1]==t[i])
j++;
nxt[i]=j;
}
}
void prework()
{
scanf("%s%s",s+1,t+1);
tlen=strlen(t+1);slen=strlen(s+1);
getnxt();
}
void mainwork()
{
f[0]=1;int j=0;
for(int i=1;i<=slen;i++)
{
f[i]=f[i-1];
while(j && t[j+1]!=s[i])
j=nxt[j];
if(t[j+1]==s[i])
j++;
if(j==tlen)
f[i]=(f[i]+f[i-tlen])%mod;
}
}
void print()
{
printf("Case #%d: %d\n",cas,f[slen]);
}
int main()
{
int tot;
scanf("%d",&tot);
for(cas=1;cas<=tot;cas++)
{
prework();
mainwork();
print();
}
return 0;
}
1400

被折叠的 条评论
为什么被折叠?



