A Secret hdu 6153
阿新 • • 發佈:2017-08-19
pan pen 一道 n) div math ~~ pac ont
KMP的一道水題,最初竟然傻逼的想用自動機懟,毫無疑問的T了,後來仔細想了一下,就是自動自單鏈的情況,就懟kmp,然後不知道發什麽神經沒有轉過來彎,竟然沒調出來,然後我就自己寫了單鏈的fail指針,調了很久A了,但是浪費了很多時間,賽後想想,特麽的就是個kmp,next數組跟fail指針就特麽差一位而已,果然,套個板子就A了,要不然,今天又可以多出一題了,警示自己一下,不要那麽菜啊~~~~
#include <stdio.h> #include <algorithm> #include <iostream> #include <string.h> #include<cmath> #include <queue> using namespace std; const int maxn=1e6+10; const int mod=1e9+7; int Next[maxn],en[maxn]; void kmp_pre(char x[],int m) { int i,j; j=Next[0]=-1; i=0; while(i<m) { while(-1!=j && x[i]!=x[j])j=Next[j]; Next[++i]=++j; } }int KMP_Count(char x[],int m,char y[],int n) { memset(en,0,sizeof en); int j=0; int ans=0; kmp_pre(x,m); for(int i=0;i<n;i++) { if(x[j]==y[i]) { en[j]++;j++; if(j==m)j=Next[j]; continue; } j=Next[j];while(j!=-1 && x[j]!=y[i])j=Next[j]; if(j==-1){j=0;continue;} en[j]++;j++; if(j==m)j=Next[j]; } for(int i=m;i>0;i--) en[Next[i]-1]+=en[i-1]; for(int i=0;i<m;i++) ans=(ans+1ll*en[i]*(i+1)%mod)%mod; return ans; } char s[maxn],ts[maxn]; int main() { freopen("input.txt","r",stdin); int T;scanf("%d",&T); while(T--) { scanf("%s%s",s,ts); strrev(s); strrev(ts); int ans=KMP_Count(ts,strlen(ts),s,strlen(s)); printf("%d\n",ans); } return 0; }
A Secret hdu 6153