學密碼學必定得學程序測試
曾經,ZYJ同窗很是喜歡密碼學。有一天,他發現了一個很長很長的字符串S1。他很好奇那表明着什麼,因而神奇的WL給了他另外一個字符串S2。可是很不幸的是,WL忘記跟他說是什麼意思了。這個時候,ZYJ不得不求助與偉大的ZP。ZP笑了笑說,這個很神奇的,WL的意思是隻要你找到她給你的字符串在那個神奇的字符串的位置,你就會有神奇的發現。ZYJ恍然大悟,原來如此,可是悲劇來了,他居然不知道怎麼找。。。。是的,很囧是否是。因此這時候就須要化身爲超級瑪麗亞的你現身了,告訴他吧。。。。。。spa
首先輸入一個n。表示有n組測試數據。code
每組測試數據有兩行。orm
第一行爲字符串S1,長度不大於1000000。字符串
第二行爲字符串S2,長度不大於10000,而且長度不小於2。string
輸出S2在S1的位置。若是有多個位置,只輸出第一個位置。it
若是找不到,就輸出「::>_<::「(不輸出雙引號)。io
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; }