[每日一题2020.06.12]P3375 模板KMP字符串匹配

Posted roccoshi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[每日一题2020.06.12]P3375 模板KMP字符串匹配相关的知识,希望对你有一定的参考价值。

题目链接

关于kmp : https://www.cnblogs.com/roccoshi/p/13096988.html

关于kmp, 想了很久, 我觉得不应该放在这里写, 另开一贴记录一下.

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;


vector<int> getnext(string s) {
	vector<int> next;
	next.push_back(-1);
	int i = 0, j = -1;	
	while(i < s.size()) {
		if(s[i] == s[j] || j==-1) {
			i++;
			j++;
			next.push_back(j);
		}
		else {
			j = next[j]; 
		}
	}
	return next;
}

vector<int> kmp(string s1, string s2) {	// kmp : 找出s2在s1中出现的位置(全部)
	vector<int> next = getnext(s2);
	vector<int> ans;
	int i = 0, j = 0; 	// i指s1, j指s2
	while(i < s1.size()) {
		if(s1[i] == s2[j] || j==-1) {
			if(j == s2.size()-1) { 
				ans.push_back(i - j); 
				j = next[j];
			}
			else {
				i++;
				j++;
			}
		}
		else {
			j = next[j];
		}
	}
	return ans;
}


int main(){
	ios::sync_with_stdio(false);
    cin.tie(0);
    
    string s;
    string s1;
    cin >> s >> s1;
    vector<int> ans = kmp(s,s1);
    vector<int> next = getnext(s1);
    for (int i = 0; i < ans.size(); ++i) {
    	cout << ans[i] + 1 << endl;
    }
    for (int i = 1; i < next.size(); ++i) 
    {
    	cout << next[i] << " ";
    }
    return 0;
}

以上是关于[每日一题2020.06.12]P3375 模板KMP字符串匹配的主要内容,如果未能解决你的问题,请参考以下文章

(每日一题)2016 北京ICPC网络赛G hihocoder 1388 (中国剩余定理 + NTT)

LeetCode每日一题

LeetCode 每日一题「最高频元素的频数」

LeetCode 每日一题「最高频元素的频数」

每日一题658. 找到 K 个最接近的元素

每日一题793. 阶乘函数后 K 个零