问一下这种KMP写法会不会RE
查看原帖
问一下这种KMP写法会不会RE
304524
崔化博楼主2022/8/14 21:39
#include <iostream>
#include <string>
#include <cstdio>
#define MAXN 1000005
using namespace std;
string s1,s2;
int nxt[MAXN];
int cnt;
void get(string s){
    nxt[0]=nxt[1]=0;
    for(int i=1;i<s.size();++i){
        int j=nxt[i];
        while(j&&s[i]!=s[j])j=nxt[j];
        nxt[i+1]=(s[i]==s[j])?j+1:0;
    }
}
void kmp(){
    int last=-1;
    get(s2);
    int j=0;
    for(int i=0;i<s1.size();++i){
//    	if(j==s2.size())cout<<"eee"<<' '<<s2[j]<<'\n';
        while(j&&s1[i]!=s2[j])j=nxt[j];//就是此处,如果j==s2.size()后访问s2[j]会不会RE
        if(s1[i]==s2[j])++j;
        if(j==s2.size()){
            ++cnt;
            cout<<i-s2.size()+2<<endl;
            //第一个字符的位置是i+1-s2.size(),末尾是i。
            /*无重叠
            if(i-last>=s2.size()){
                ++cnt;
                last=i;
            }
            */
        }
    }
}
int main(){
    cin>>s1>>s2;
    kmp();
    for(int i=1;i<=s2.size();++i){
        cout<<nxt[i]<<' ';
    }
    return 0;
}
2022/8/14 21:39
加载中...