開始SB地暴力,就是枚舉a串,結果SB地TLE。。。
後來發現我真的很SB,完全沒有利用好kmp的優美性質,在kmp的主程式中(主程式跟預先處理程式應該分得清吧,雖然他們長得好像),每次尋找的結果就是得出b[i]對應a串中最長的前置長度j,具體是下面程式中標記部分。
#include <map>#include <set>#include <list>#include <queue>#include <deque>#include <stack>#include <string>#include <time.h>#include <cstdio>#include <math.h>#include <iomanip>#include <cstdlib>#include <limits.h>#include <string.h>#include <iostream>#include <fstream>#include <algorithm>using namespace std;#define LL long long#define MIN INT_MIN#define MAX INT_MAX#define PI acos(-1.0)#define FRE freopen("input.txt","r",stdin)#define FF freopen("output.txt","w",stdout)#define N 50005char a[N],b[N];int p[N];int n,m;void gao () { int i,j = 0; p[1] = 0; for (i = 2; i <= n; i++) { while (j > 0 && a[i] != a[j+1]) { j = p[j]; } if (a[i] == a[j+1]) j++; p[i] = j; }}void kmp () { int i,j = 0; for (i = 1; i <= m; i++) { while (j > 0 && a[j+1] != b[i]) { j = p[j]; } if (a[j+1] == b[i]) j++;//就是這裡,得出b[i]對應a串中最長的前置長度j } if (!j) puts("0"); else { for (i = 1; i <= j; i++) printf("%c",a[i]); printf(" %d\n",j); }}int main () { while (scanf("%s%s",a+1,b+1) != -1 ) { int i,j; n = strlen(a+1); m = strlen(b+1); gao();//O(n) kmp(); } return 0;}