[关闭]
@994495jj 2017-08-19T12:42:01.000000Z 字数 1316 阅读 953

hdu6153

201708 (ACM)字符串----KMP


  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define fi first
  4. #define se second
  5. #define pb push_back
  6. #define sz(a) (int)a.size()
  7. #define mp make_pair
  8. #define rep(i, a, b) for(int i=(a); i<(b); i++)
  9. #define de(a) cout<<#a<<"="<<a<<endl;
  10. #define dd(a) cout<<#a<<"="<<a<<" ";
  11. typedef long long ll;
  12. typedef pair<int, int> pii;
  13. typedef vector<int> vi;
  14. //--------
  15. const int N=1000005;
  16. const int mod=1e9+7;
  17. int ns[N],nt[N];
  18. char s[N],t[N];
  19. void kmp(char *s,int *ns,char *t,int *nt){
  20. int lens = strlen(s);
  21. int lent = strlen(t);
  22. nt[0] = -1;
  23. for(int i=0,j=-1;i<lens;++i){
  24. while(j >= 0 && s[i] != t[j + 1]) j = nt[j];
  25. if(s[i] == t[j + 1]) ++j;
  26. ns[i] = j;
  27. if(j + 1 == lent) j = nt[j];
  28. }
  29. }
  30. void KMP(){
  31. scanf("%s%s",s,t);
  32. reverse(s,s+strlen(s));
  33. reverse(t,t+strlen(t));
  34. kmp(t+1,nt+1,t,nt);
  35. kmp(s,ns,t,nt);
  36. }
  37. ll cnt[N];
  38. void solve() {
  39. for(int i=0;s[i];++i) {
  40. if(~ns[i]) ++cnt[ns[i]];
  41. }
  42. ll ans=0;
  43. for(int i=strlen(t)-1;~i;--i) {
  44. ans=(ans+1ll*(i+1)*cnt[i]%mod)%mod;
  45. cnt[nt[i]]=(cnt[nt[i]]+cnt[i])%mod;
  46. }
  47. printf("%lld\n",ans);
  48. }
  49. int main() {
  50. int T;scanf("%d",&T);
  51. while(T--) {
  52. memset(cnt,0,sizeof(cnt));
  53. KMP();
  54. solve();
  55. }
  56. return 0;
  57. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注