KMP70求调
查看原帖
KMP70求调
1210473
ytezwsw_xjy楼主2025/7/19 11:18
#include <bits/stdc++.h>
using namespace std;
vector<int> ycl;
vector<int> KMP_ycl(const string& b) {
    int m=b.size();
    vector<int> ycl(m,0);
    int len=0;
    int i=1;
    while(i<m){
        if(b[i]==b[len]) {
            len++;
            ycl[i]=len;
            i++;
        }else{
            if(len!=0){
                len=ycl[len-1]; 
            }else{
                ycl[i]=0;
                i++;
            }
        }
    }
    return ycl;
}
vector<int> KMP(const string& a,const string& b) {
    vector<int> s;
    int n=a.size();
    int m=b.size();
    if (m==0) return s;
    vector<int> ycl=KMP_ycl(b);
    int i=0;
    int j=0;
    while (i<n) {
        if (b[j]==a[i]) {
            j++;
            i++;
        }
        if (j==m) {
            s.push_back(i-j);
            j=ycl[j-1];
        } else if (i<n && b[j]!=a[i]) {
            if(j!=0) {
                j=ycl[j-1];
            }else{
                i++;
            }
        }
    }
    return s;
}
int main() {
    string a;
    string b;
    cin>>a>>b;
    vector<int> ans=KMP(a,b);
    if (ans.empty()) {
    	return 0; 
    } else {
        for (int pos : ans) {
            cout<<pos+1<<"\n";
        }
    }
    vector<int> ycl=KMP_ycl(b);
    for(auto qwq : ycl){
    	cout<<qwq<<' ';
	}
    return 0;
}
检查了半天也没发现什么问题,求条
2025/7/19 11:18
加载中...