HDU 6153 A Secret
阿新 • • 發佈:2017-08-19
using algorithm hit str nbsp algo hdu cpp 模板
題意:給定兩個串,求其中一個串 s
的每個後綴在另一個串 t
中出現的次數。
題解:把兩個串都 reverse 一下,給 t
做個 KMP 之後讓 s
在 KMP 出來的結果上跑一遍就好了。
kmp模板題。
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<cmath> #include<algorithm> #include<vector> #include<queue> #include<stack> #include<map> #include<set> #define lson i<<1 #define rson i<<1|1 using namespace std; const int N=1e6+5; const int mod=1e9+7; char s[N],t[N]; int f[N],cnt[N]; int n,m; void getnext() { f[0]=f[1]=0; for(int i=1;i<m;i++) { int j=f[i]; while(j&&s[i]!=s[j]) j=f[j]; f[i+1]=(s[i]==s[j])?j+1:0; } } void kmp() { memset(cnt,0,sizeof(cnt)); for(int i=0,j=0;i<n;i++) { while(j&&t[i]!=s[j]) j=f[j]; j+=(t[i]==s[j]); cnt[j]++; } for(int i=m;i>0;i--) cnt[f[i]]+=cnt[i]; } int main() { int T; scanf("%d",&T); while(T--) { scanf("%s%s",t,s); n=strlen(t); m=strlen(s); reverse(t,t+n); reverse(s,s+m); getnext(); kmp(); int ans=0; for(int i=1;i<=m;i++) ans=(ans+1LL*i*cnt[i]%mod)%mod; printf("%d\n",ans); } return 0; }
HDU 6153 A Secret