求助,只得了30分!
查看原帖
求助,只得了30分!
1155731
xhuan楼主2024/9/18 19:52
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
const int maxn=1e6+10000;
int ne[maxn],sign[maxn];
string a,b;
void init(){
   ne[0]=0;
   int len=0;
   int i=1;
   while(i<b.size()){
    if(b[i]==b[len]){
        len++;
        ne[i]=len;
        i++;
    }
    else{
        if(len) len=ne[len-1];
        else{
            ne[i]=0;
            i++;
        }
    }
   }
}
signed main(){
    ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    int ans=0,loc=1;
    cin>>a>>b;
    if(b.size()==1){
        for(int i=0;i<a.size();i++) if(a[i]==b[0]) cout<<i+1<<endl;
        cout<<0<<endl;
        return 0;
    }
    init();
   for(int i=0,j=0;i<a.size();i++){
    //cout<<b.size()<<endl;
    if(a[i]==b[j]){
        //cout<<1<<endl;
        //cout<<j<<" "<<b.size()<<endl;
        if(j==b.size()-1){
           // cout<<1<<endl;
        ans++;
       // cout<<i<<endl;
        sign[loc++]=i-b.size()+2;
        j=ne[j];
        continue;}
       // j++;
    }
    else j=ne[j-1];
    j++;
   }
   //cout<<ans<<endl;
   for(int i=1;i<=ans;i++) cout<<sign[i]<<endl;
   for(int i=0;i<b.size();i++) cout<<ne[i]<<" ";
    cout<<endl;
}
2024/9/18 19:52
加载中...