zoukankan      html  css  js  c++  java
  • 字符串匹配

    【题目描述】

    给定两个串A、B,可以得到从A的任意位开始的子串和B匹配的长度。

    给定K个询问,对于每个询问给定一个X,求出匹配长度恰为X的位置有多少个(N,M,K <= 200000)。

    【输入描述】

    第一行输入三个数N、M、K,表示A的长度、B的长度和询问数;

    第二行输入串A;

    第三行输入串B;

    接下来K行,每行输入一个数X。

    【输出描述】

    对于每次询问,输出一个数。

    【样例输入】

    6 2 2

    aabcde

    ab

    0

    2

    【样例输出】

    4

    1

    源代码:
    
    #include<cstdio>
    char S1[200001],S2[200001];
    int n,m,k,Next[200001],Num[200001];
    int main()
    {
        scanf("%d%d%d
    ",&n,&m,&k);
        gets(S1); //gets()读到回车结束。
        gets(S2);
        Next[0]=Next[1]=0;
        for (int a=1;a<m;a++)
        {
            int T=Next[a];
            while (T&&S2[T]!=S2[a])
              T=Next[T];
            Next[a+1]=T+(S2[T]==S2[a]);
        }
        int T(0);
        for (int a=0;a<n;a++)
        {
            while (T&&S1[a]!=S2[T])
              T=Next[T];
            if (S1[a]==S2[T])
              T++;
            Num[T]++;
        }
        for (int a=m;a>0;a--)
          Num[Next[a]]+=Num[a];
        for (int a=0;a<=m;a++)
          Num[a]-=Num[a+1];
        for (int a=1;a<=k;a++)
        {
            int t;
            scanf("%d",&t);
            printf("%d
    ",Num[t]);
        }
        return 0;
    }
  • 相关阅读:
    phpstudy下允许所有的目录科访问
    fastadmin怎么自动生成框架目录
    优化数据库
    git操作是出现Username for 'https://github.com':的验证问题
    git上传命令步骤
    mysql 组合两张表
    删除重复的电子邮箱
    Neo4j
    opencv学习笔记(2
    opencv学习笔记(1)
  • 原文地址:https://www.cnblogs.com/Ackermann/p/5858847.html
Copyright © 2011-2022 走看看