@994495jj
2017-08-19T12:42:01.000000Z
字数 1316
阅读 953
201708 (ACM)字符串----KMP
#include<bits/stdc++.h>using namespace std;#define fi first#define se second#define pb push_back#define sz(a) (int)a.size()#define mp make_pair#define rep(i, a, b) for(int i=(a); i<(b); i++)#define de(a) cout<<#a<<"="<<a<<endl;#define dd(a) cout<<#a<<"="<<a<<" ";typedef long long ll;typedef pair<int, int> pii;typedef vector<int> vi;//--------const int N=1000005;const int mod=1e9+7;int ns[N],nt[N];char s[N],t[N];void kmp(char *s,int *ns,char *t,int *nt){int lens = strlen(s);int lent = strlen(t);nt[0] = -1;for(int i=0,j=-1;i<lens;++i){while(j >= 0 && s[i] != t[j + 1]) j = nt[j];if(s[i] == t[j + 1]) ++j;ns[i] = j;if(j + 1 == lent) j = nt[j];}}void KMP(){scanf("%s%s",s,t);reverse(s,s+strlen(s));reverse(t,t+strlen(t));kmp(t+1,nt+1,t,nt);kmp(s,ns,t,nt);}ll cnt[N];void solve() {for(int i=0;s[i];++i) {if(~ns[i]) ++cnt[ns[i]];}ll ans=0;for(int i=strlen(t)-1;~i;--i) {ans=(ans+1ll*(i+1)*cnt[i]%mod)%mod;cnt[nt[i]]=(cnt[nt[i]]+cnt[i])%mod;}printf("%lld\n",ans);}int main() {int T;scanf("%d",&T);while(T--) {memset(cnt,0,sizeof(cnt));KMP();solve();}return 0;}
