HDU 2594 (KMP入門)

_Phoenix發表於2015-08-24

關於學習KMP的姿勢,是通過這篇博文來的從頭到尾徹底理解KMP

文章寫得非常的詳細,所以我這個弱渣就沒必要再談一遍辣~~(>_<)~~

個人領悟的KMP就是保持主串不動,通過一個next陣列來移動匹配串,最終達到高效率匹配字元作用的一種演算法=。=

巨巨說KMP是純模板題。。。。。。

——————————————————————————————————————————————————————————————————————————————

這道題題意是說給你兩個字串,求兩個字串最長的相等前字尾(第一個字串求字首,第二個字串求字尾)。

程式碼如下:

#include <cstdio>
#include <cmath>
#include <cstring>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <set>
#include <vector>
#include <sstream>
#include <queue>
#include <typeinfo>
#include <fstream>
#include <map>
#include <stack>
#include <string>
typedef long long LL;
using namespace std;
int k_next[100000];
void kmp_next (string s)
{
	int len = s.length();
	k_next[0] = -1;
	int k = -1; //前 
	int j = 0;  //後 
	while (j < len)
	{
		if (k == -1 || s[k] == s[j])
		{
			k++;
			j++;
			k_next[j] = k;
		}
		else
		{
			k = k_next[k];
		}
	}
}
int main()
{
	string s1, s2;
	while (cin >> s1 >> s2)
	{
		memset(k_next, 0, sizeof(k_next));
		string s3 = s1 + s2;
		int flag, max;
		max = INT_MIN;
		kmp_next(s3);
		int len = s3.length();
		while (k_next[len] > s1.length() || k_next[len] >s2.length()) //如果超出範圍就找更小的匹配串 
			len = k_next[len];
		len = k_next[len];
		for (int i=0; i<len; i++)
			cout << s3[i];
		if (len)
			cout << " ";
		cout << len << endl; 
		s1.clear();
		s2.clear();
	}
}


相關文章