求调49pts代码,救救孩子吧,孩子调了一年了
查看原帖
求调49pts代码,救救孩子吧,孩子调了一年了
469470
EurekaStriker楼主2023/9/13 20:04

RT

#include<bits/stdc++.h>
using namespace std;
int cmp[1000010],pre[1000010],nex[1000010],ans[1000010];
int lena,lenb,cnt;
int a[1000010],b[1000010],l[1000010],r[1000010],kmp[1000010];
bool check(int temp[],int u,int v){
	return temp[v+l[u]]<=temp[v]&&temp[v+r[u]]>=temp[v];
}
void setup_l_and_r()
{
    for(int i=lena;i>=1;i--){
    	int temp=cmp[i];
    	if(pre[temp])
    		l[i]=a[pre[temp]]-i;
    	if(nex[temp]<=lena)
    		r[i]=a[nex[temp]]-i;
    	pre[nex[temp]]=pre[temp];
    	nex[pre[temp]]=nex[temp];
    }
}
void setup_kmp(){
    int j=2,k=0;
    while(j<=lena){
        while(k!=0&&!check(cmp,k+1,j))
        	k=kmp[k];
        if(check(cmp,k+1,j))
        	k++;
        kmp[j]=k;
        j++;
    }
}
void find()
{
    int j=1,k=0;
    while(j<=lenb)
    {
        while(k!=0&&!check(b,k+1,j))
        	k=kmp[k];
        if(check(b,k+1,j))
        	k++;
        if(k==lena)
        	ans[++cnt]=j-lena+1,k=cmp[k];
        j++;
    }
}
int main(){
    cin>>lena>>lenb;
    for(int i=1;i<=lena;i++){
    	cin>>a[i];
    	cmp[a[i]]=i;
    	pre[i]=i-1;
    	nex[i]=i+1;
    }
    for(int i=1;i<=lenb;i++)
    	cin>>b[i];
    setup_l_and_r();
    setup_kmp();
    find();
    cout<<cnt<<"\n";
    for(int i=1;i<=cnt;i++)
    	cout<<ans[i]<<' ';
    return 0;
}
2023/9/13 20:04
加载中...