zoukankan      html  css  js  c++  java
  • [每日一题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年3月22日
    2021年3月21日
    2021年3月20日
    人件集阅读笔记02
    2021年3月19日
    2021年3月18日
    2021年3月17日
    2021年3月16日
    2021年3月15日
    梦断代码阅读笔记01
  • 原文地址:https://www.cnblogs.com/roccoshi/p/13096925.html
Copyright © 2011-2022 走看看