學密碼學必定得學程序 KMP

學密碼學必定得學程序測試

題目描述

曾經,ZYJ同窗很是喜歡密碼學。有一天,他發現了一個很長很長的字符串S1。他很好奇那表明着什麼,因而神奇的WL給了他另外一個字符串S2。可是很不幸的是,WL忘記跟他說是什麼意思了。這個時候,ZYJ不得不求助與偉大的ZP。ZP笑了笑說,這個很神奇的,WL的意思是隻要你找到她給你的字符串在那個神奇的字符串的位置,你就會有神奇的發現。ZYJ恍然大悟,原來如此,可是悲劇來了,他居然不知道怎麼找。。。。是的,很囧是否是。因此這時候就須要化身爲超級瑪麗亞的你現身了,告訴他吧。。。。。。spa

輸入

 

首先輸入一個n。表示有n組測試數據。orm

每組測試數據有兩行。字符串

第一行爲字符串S1,長度不大於1000000。string

第二行爲字符串S2,長度不大於10000,而且長度不小於2。it

輸出

 

輸出S2在S1的位置。若是有多個位置,只輸出第一個位置。io

若是找不到,就輸出「::>_<::「(不輸出雙引號)。class

示例輸入

1
ASDFGDF
DF

示例輸出

3
#include<stdio.h>
#include<string.h>
#define inf 1000001
#define dfs 10001
char str1[inf], str2[dfs];
int next[dfs];
void GetNext(char* p,int next[])
{
    int pLen = strlen(p);
    next[0] = -1;
    int k = -1;
    int j = 0;
    while (j < pLen - 1)
    {
        if (k == -1 || p[j] == p[k])
        {
            ++k;
            ++j;
            next[j] = k;
        }
        else
           k = next[k];
    }
}
int KmpSearch(char* s, char* p)
{
    int i = 0;
    int j = 0;
    int sLen = strlen(s);
    int pLen = strlen(p);
    while (i < sLen && j < pLen)
    {
        if (j == -1 || s[i] == p[j])
        {
            i++;
            j++;
        }
        else
            j = next[j];
    }
    if (j == pLen)
        printf("%d\n", i - j + 1);
    else
        printf("::>_<::\n");
    return 0;
}
int main(){
    int n;
    scanf("%d", &n);
    while(n--) {
        scanf("%s%s", &str1, &str2);
        GetNext(str2, next);
        KmpSearch(str1, str2);
    }
    return 0;
}
相關文章
相關標籤/搜索