jiayixuan1205
2024-11-18 21:42:03
kmp+dp。
首先,寻找
#include<bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
const int mod = 1e9+7; const int N = 1e5+10; int T,dp[N],nex[N],pos[N],tot; int cas=0; string a,b;
signed main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin>>T; while(T--) { memset(dp,0,sizeof(dp)); memset(pos,0,sizeof(pos)); memset(nex,0,sizeof(nex)); cas++; cin>>a>>b; int la=a.size(); int lb=b.size(); a=' '+a;b=' '+b; int j=0; for(int i=2;i<=lb;i++) { while(j&&b[i]!=b[j+1]) j=nex[j]; if(b[i]==b[j+1]) j++; nex[i]=j; } j=tot=0; for(int i=1;i<=la;i++) { while(j&&a[i]!=b[j+1]) j=nex[j]; if(a[i]==b[j+1]) j++; if(j==lb) { pos[i]=1; j=nex[j]; } } dp[0]=1; for(int i=1;i<=la;i++) { if(!pos[i]) dp[i]=dp[i-1]%mod; else dp[i]=(dp[i-1]+dp[i-lb])%mod; } cout<<"Case #"<<cas<<": "<<dp[la]<<endl; } return 0; }