zoukankan      html  css  js  c++  java
  • KMP简单应用

    KMP简单应用

    Time Limit: 1000MS Memory limit: 65536K

    题目描述

    给定两个字符串string1和string2,判断string2是否为string1的子串。

    输入

     输入包含多组数据,每组测试数据包含两行,第一行代表string1(长度小于1000000),第二行代表string2(长度小于1000000),string1和string2中保证不出现空格。

    输出

     对于每组输入数据,若string2是string1的子串,则输出string2在string1中的位置,若不是,输出-1。

    示例输入

    abc
    a
    123456
    45
    abc
    ddd
    

    示例输出

    1
    4
    -1
    
     
     #include <stdio.h>
    #include <string.h>
    
    char S[1000010], T[100010];
    int next[100010];
    
    void Get_Next()
    {
        int i = 0, j = -1, len = strlen(T);
        next[0] = -1;
        while(i < len)
        {
            if(j == -1 || T[i] == T[j])
            {
                ++i;
                ++j;
                next[i] = j;
            }
            else
            {
                j = next[j];
            }
        }
    }
    
    int KMP()
    {
        int len1 = strlen(S), len2 = strlen(T);
        int i = 0, j = 0;
        while(i < len1 && j < len2)
        {
            if(S[i] == T[j] || j == -1
    			)
            {
                ++i;
                ++j;
            }
            else
            {
                j = next[j];
            }
        }
        if(j >= len2)
            return i-len2+1;
        else
            return -1;
    }
    
    void Solve()
    {
        while(~scanf("%s", S))
        {
            scanf("%s", T);
            Get_Next();
            int Ans = KMP();
            printf("%d
    ", Ans);
        }
    }
    
    int main()
    {
        //freopen("data.in", "r", stdin);
        Solve();
    
        return 0;
    }
     
    
     
    
    

    每天训练发现我比别人做的好慢,但是理解的更深刻,如果一开始学一个新知识点就搜模板,那么这样的人是走不远的,毕业之后带走的只有思维,什么荣誉,奖杯都已经不重要了。
  • 相关阅读:
    20210304
    20210303
    20210302
    20210210
    20210209
    20210208
    20210207
    例4-6
    例4-5
    例4-4
  • 原文地址:https://www.cnblogs.com/6bing/p/3931310.html
Copyright © 2011-2022 走看看