求助!悬赏1个关注
查看原帖
求助!悬赏1个关注
907368
andycode楼主2024/8/22 15:36

8个WA,12个MLE

#include <bits/stdc++.h>
using namespace std;
struct Node{
    string hz;
    int k;
}sa[300005];
int n;
unsigned long long h[300005];
string s;
bool cmp(Node a,Node b){
    return a.hz<b.hz;
}
unsigned long long Hash(int l,int r){
	if(l==0)
		return h[r];
    return h[r]-h[l-1]*pow(29,r-l+1);
}
int find_qz_len(Node x,Node y){
    if(x.hz.size()>y.hz.size())
        swap(x,y);
    if(x.hz[0]!=y.hz[0])
        return 0;
    int l=1,r=x.hz.size();
    while(l<r){
        int mid=(l+r+1)/2;
        if(Hash(x.k,x.k+mid-1)==Hash(y.k,y.k+mid-1))
            l=mid;
        else
            r=mid-1;
    }
    return l;
}
int main(){
	//cout<<(sizeof(h)+sizeof(sa))/1024/1024<<endl;
    cin>>s;
    n=s.size();
    sa[n].hz="";
    for(int i=n-1;i>=0;i--)
        sa[i]={s[i]+sa[i+1].hz,i};
	sort(sa,sa+n,cmp);
    for(int i=0;i<n;i++){
    	cout<<sa[i].k<<' ';
    	h[i]=(i==0? 0:h[i-1]*29)+(s[i]-'a');
	}
    cout<<"\n0 ";
    for(int i=1;i<n;i++)
        cout<<find_qz_len(sa[i],sa[i-1])<<' ';
    return 0;
}
2024/8/22 15:36
加载中...