HihoCoder - 1015(KMP匹配,模板)

题意:

封装了一个可KMP匹配的类结构,比较高效。

代码:

// HihoCoder - 1015
#include <iostream>
#include <string>
#include <vector>
class ModelString 
{
private:
	std::string s;
	std::vector<int> dp; // dp[i]表示:s[0]~s[dp[i]] 和 s[i-dp[i]]~s[i] 相同 len = dp[i]+1
public:
	ModelString();
	ModelString(std::string s);
	std::vector<int> kmp(std::string t);
};
ModelString::ModelString() {
	s.clear();
	dp.clear();
}
ModelString::ModelString(std::string s) {
	this->s = s;
	dp.push_back(-1);
	// init dp
	for (int i = 1; i < s.length(); i++) { 
		if (s[i] == s[dp[i - 1] + 1]) {
			dp.push_back(dp[i - 1] + 1);
		}
		else {
			int now = i - 1;
			while (now != -1 && s[i] != s[dp[now] + 1]) {
				now = dp[now];
			}
			if (now == -1) {
				dp.push_back(-1);
			}
			else {
				dp.push_back(dp[now] + 1);
			}
		}
	}
}
std::vector<int> ModelString::kmp(std::string t) {
	std::vector<int> ret; 
	int i = 0, j = 0;
	while (i < s.length()) {
		if (s[i] != t[j]) {
			if (j != 0) {
				j = dp[j - 1] + 1;
			}
			else {
				i++;
			}
		}
		else {
			i++, j++;
			if (j == t.length()) {
				ret.push_back(i - t.length());
				j = dp[j - 1] + 1;
			}
		}
	}
	return ret;
}

int main()
{
	int T;
	std::cin >> T;
	while (T--) {
		std::string s, t;
		std::cin >> t >> s;
		ModelString ans = ModelString(s);
		std::cout << ans.kmp(t).size() << std::endl;
	}
}

发布了227 篇原创文章 · 获赞 142 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/qq_36306833/article/details/102870839