迴文串算法之-manacher

\quad給定一個字符串s="abababc"s="abababc",求這個字符串有多少個迴文串或者最長迴文串是哪個。我用d1[i]d_1[i]是以i爲中心長度爲奇數的迴文串個數,d2[i]d_2[i]是以i爲中心長度爲偶數的迴文串個數,則對字符串s而言,d1[0]=1(a),d1[1]=2(b,aba),d1[2]=3(a,bab,ababa),d2[i]=0()d_1[0]=1(a),d_1[1]=2(b,aba),d_1[2]=3(a,bab,ababa),d_2[i]=0(沒有長度爲偶數的迴文串)。對於字符串t="cbaabd"t="cbaabd"d2[0]=d2[1]=d2[2]=0,d2[3]=2(aa,baab)d_2[0]=d_2[1]=d_2[2]=0,d_2[3]=2(aa,baab)。用最樸素的枚舉法可以在O(n2)O(n^2)內求出d1[i],d2[i]d_1[i],d_2[i],程序如下:

#include <iostream>
#include <vector>
using namespace std;
int main(int argc, char const *argv[])
{
	string s; cin >> s;
	int n = s.length();
	vector<int> d1(n), d2(n);
	for (int i = 0; i < n; i++) {
	  d1[i] = 1;
	  while (0 <= i - d1[i] && i + d1[i] < n && s[i - d1[i]] == s[i + d1[i]]) {
	    d1[i]++;
	  }
	  d2[i] = 0;
	  while (0 <= i - d2[i] - 1 && i + d2[i] < n &&
	         s[i - d2[i] - 1] == s[i + d2[i]]) {
	    d2[i]++;
	  }
	}
	for(int i = 0; i < n; i++) cout << d1[i] << " " << d2[i] << endl;
	return 0;
}
  • d1[i]+d2[i]d_1[i]+d_2[i]是以i爲中心的迴文串個數
  • sum(d1[i]+d2[i])sum(d_1[i]+d_2[i])是字符串總的迴文串個數
  • max(max(d1[i]21),max(d2[i]2))max(max(d_1[i]*2-1), max(d_2[i]*2))爲字符串最長迴文串長度

\quad可見,如果求出d1[i],d2[i]d_1[i],d_2[i],所有關於字符串的問題都將迎刃而解。但上面樸素的解法未免太過低效,需要更快的解法,於是便有了manacher算法。

#include <iostream>
#include <vector>
using namespace std;
int main(int argc, char const *argv[])
{
	string s; cin >> s;
	int n = s.length();
	vector<int> d1(n);
	for (int i = 0, l = 0, r = -1; i < n; i++) {
	  int k = (i > r) ? 1 : min(d1[l + r - i], r - i);
	  while (0 <= i - k && i + k < n && s[i - k] == s[i + k]) {
	    k++;
	  }
	  d1[i] = k--;
	  if (i + k > r) {
	    l = i - k;
	    r = i + k;
	  }
	}
	vector<int> d2(n);
	for (int i = 0, l = 0, r = -1; i < n; i++) {
	  int k = (i > r) ? 0 : min(d2[l + r - i + 1], r - i + 1);
	  while (0 <= i - k - 1 && i + k < n && s[i - k - 1] == s[i + k]) {
	    k++;
	  }
	  d2[i] = k--;
	  if (i + k > r) {
	    l = i - k - 1;
	    r = i + k;
	  }
	}
	for(int i = 0; i < n; i++) cout << d1[i] << " " << d2[i] << endl;
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章