zoukankan      html  css  js  c++  java
  • A Secret hdu 6153

    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
    ",ans);
        }
        return 0;
    }
  • 相关阅读:
    1、Python的初识与简介
    解密解密
    python看是32位还是64
    linux实战一段,安装python3(centos)
    前段技巧
    django后端safe和前端safe的方法
    测试
    python小知识整理
    ajax格式
    111
  • 原文地址:https://www.cnblogs.com/MeowMeowMeow/p/7397684.html
Copyright © 2011-2022 走看看