hdu 6153 A Secret【KMP/想法题】
2017-08-22 22:04
337 查看
题目
http://acm.hdu.edu.cn/showproblem.php?pid=6153题意
给定两个串,求其中一个串 s 的每个后缀在另一个串 t 中出现的次数。分析
后缀S(i..len)出现在后缀S(i-1…len)中,所以把两个串逆序后求KMP,这样从头扫到尾匹配一下,然后统计前缀出现的次数即可。代码
#include <cstdio> #include <set> #include <iostream> #include <map> #include <vector> #include <cstring> #include <algorithm> #include <string> #include <cmath> using namespace std; const int N=1e6+5; const int mod=1e9+7; typedef long long LL; char s ,t ; int slen,tlen; int nex ; int num ,vis ; void getNext() { int j,k; j=0;k=nex[0]=-1; while(j<tlen){ if(k==-1||t[j]==t[k])nex[++j]=++k; else k=nex[k]; } } int KMP_Count() { getNext(); int ans=0; int j=0; for(int i=0;i<slen;i++){ while(j&&s[i]!=t[j])j=nex[j]; if(s[i]==t[j]){ num[j]++; j++; } if(j==tlen){ ans++; j=nex[j]; } } return ans; } int main() { int T; scanf("%d",&T); while(T--){ memset(num,0,sizeof(num)); memset(vis,0,sizeof(vis)); scanf("%s%s",s,t); slen=strlen(s); tlen=strlen(t); for(int i=0;i<slen/2;i++)swap(s[i],s[slen-i-1]); for(int i=0;i<tlen/2;i++)swap(t[i],t[tlen-i-1]); KMP_Count(); for(int i=tlen;i>=0;i--){ if(!vis[nex[i]])num[nex[i]]+=num[i]; vis[nex[i]]=1; } LL ans=0; for(int i=0;i<tlen;i++){ ans+=(LL)num[i]*(i+1); ans%=mod; } cout<<ans<<endl; } return 0; }
相关文章推荐
- hdu 6153 A Secret(kmp||扩展kmp)
- 【HDU 6153】A Secret (KMP)
- hdu 6153 A Secret(kmp||扩展kmp)
- 【kmp或扩展kmp】HDU 6153 A Secret
- HDU 6153 A Secret(KMP)
- HDU 6153 A Secret(扩展kmp)
- HDU 6153 A Secret(kmp)
- hdu 6153 A Secret(kmp||扩展kmp)
- HDU 6153 A Secret(拓展KMP)
- HDU 6153 A Secret(kmp)
- hdu 6153 A Secret(KMP)
- hdu 6153 A Secret(kmp||扩展kmp)
- HDU 6153 A Secret 扩展kmp
- HDU 6153 A Secret(KMP变形)
- HDU 6153 A Secret kmp || extkmp
- hdu 6153 A Secret(kmp||扩展kmp)
- hdu 6153 A Secret(kmp||扩展kmp)
- hdu 6153 A Secret KMP&&扩展KMP
- HDU 6153 A Secret CCPC网络赛,KMP拓展应用
- hdu 6153 A Secret(kmp||扩展kmp)