1. 程式人生 > >kmp衍生題

kmp衍生題

題目:
已知一個字串 向末尾新增字元,使新的字串包含2個原始子串 ,例如原始串為aba 只需新增一個b即可, 若原始子串為abc 則需新增abc,若原始子串為aaa,則只需要加一個a即可。

  #include <iostream>
    #include <string>
    #include <vector>
    using namespace std;

//step1:求next陣列
vector<int>next_arr(const string &s) {
	//需要記錄字串末尾位置的後一個位置的最大字首和最大字尾的匹配值 v的大小需要比s的大小大一
	vector<int>v(s.size() + 1);
	//照樣v[0] = -1;v[1] = 1;
	v[0] = -1;
	v[1] = 0;
	int cur_pos = 0, i = 2;
	while (i < s.size() + 1) {
		if (s[i - 1] == s[cur_pos])
			v[i++] = ++cur_pos;
		else if (cur_pos>0) {
			cur_pos = v[cur_pos];
		}
		else {
			v[i++] = 0;
		}
	}
	return v;
}
int main()
{
	string str;
	cin >> str;
	vector<int>next = next_arr(str);
	cout << "要新增" << str.substr(next[str.size()], str.size())<<endl;
	cout<<"新增後的字串為"<<str+ str.substr(next[str.size()], str.size());
	return 0;
}

在這裡插入圖片描述