关于UOJ的Extra Test
查看原帖
关于UOJ的Extra Test
38171
DeNeRATe楼主2020/7/24 13:24

蒟蒻表示很懵逼

2
aa
1000000000 -1000000000
-------------------------
wrong answer 1st numbers differ - expected: '1', found: '0'
1
z
1
-------------------------
wrong answer 2nd numbers differ - expected: '0', found: '-9187201950435737472'
//P2178
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>

#define LL long long
#define Cl(X,Y) memset((X),(Y),sizeof(X))
#define FOR(i,A,B) for(LL i=A;i<=B;i++)
#define BOR(i,A,B) for(LL i=A;i>=B;i--)
#define Lson (X<<1)
#define Rson (X<<1|1)
#define FOR_SIDE(i,A) for(LL i=Head[A];i;i=Next[i])
#define INF 0x7f7f7f7f
using namespace std;
const LL MAXn=3e5+10;

LL Len,Num[MAXn],Limit=122;
LL Rank[MAXn],Sa[MAXn],Height[MAXn],Cnt;
LL Bar[MAXn],Sec[MAXn];
char Temp[MAXn];

inline void File() {
    freopen(".in","r",stdin);
    freopen(".out","w",stdout);
}

LL Pair[MAXn],Lmin[MAXn],Rmin[MAXn],Rmax[MAXn],Lmax[MAXn],Stack[MAXn],Top,Max[MAXn],L[MAXn],R[MAXn];

inline void Get_Sa() {
    FOR(i,1,Len) Bar[Rank[i]=Temp[i]]++;
    FOR(i,2,Limit) Bar[i]+=Bar[i-1];
    BOR(i,Len,1) Sa[Bar[Rank[i]]--]=i;
    for(LL k=1;k<=Len;k<<=1) {
        Cnt=0; Cl(Bar,0);
        FOR(i,Len-k+1,Len) Sec[++Cnt]=i;
        FOR(i,1,Len) if(Sa[i]>k) Sec[++Cnt]=Sa[i]-k;
        FOR(i,1,Len) ++Bar[Rank[i]];
        FOR(i,2,Limit) Bar[i]+=Bar[i-1];
        BOR(i,Len,1) Sa[Bar[Rank[Sec[i]]]--]=Sec[i];
        swap(Rank,Sec);
        Rank[Sa[1]]=1; Cnt=1;
        FOR(i,2,Len) Rank[Sa[i]]=(Sec[Sa[i]]==Sec[Sa[i-1]] && Sec[Sa[i]+k]==Sec[Sa[i-1]+k]) ? Cnt : ++Cnt;
        if(Cnt==Len) break;
        Limit=Cnt;
    }
}

inline void Get_Height() {
    LL Loc=0;
    FOR(i,1,Len) {
        if(Loc) Loc--;
        while(Temp[i+Loc]==Temp[Sa[Rank[i]-1]+Loc]) Loc++;
        Height[Rank[i]]=Loc;
    }
}

inline void Init() {
    Top=0;
	Height[1]=-1;
    Height[Len+1]=-1;
    // cout<<endl;
    // for(int i=0;i<=Len;i++) cout<<Max[i]<<endl;
    // for(int i=1;i<=Len;i++) cout<<Temp[i];
    // cout<<endl;
    // for(int i=0;i<=Len;i++) cout<<Num[i]<<" ";
    // cout<<endl;
    FOR(i,1,Len+1) {
    	Max[i]=-1LL*INF*INF;
    	LL Temp_max=Num[Stack[Top]],Temp_min=Num[Stack[Top]];
        while(Top && Height[Stack[Top]]>=Height[i]) {
     		R[Stack[Top]]=i;
     		Rmin[Stack[Top]]=Temp_min;
     		Rmax[Stack[Top]]=Temp_max;
     		Temp_min=min(Temp_min,Lmin[Stack[Top]]);
     		Temp_max=max(Temp_max,Lmax[Stack[Top]]);
     		Top--;
        }
        L[i]=Stack[Top];
    	Lmax[i]=Temp_max;
    	Lmin[i]=Temp_min;
    	Stack[++Top]=i;
    	// printf("Top:%lld Temp_max:%lld Temp_min:%lld Max:%lld Height:%lld\n",Top,Temp_max,Temp_min,Max[i],Height[i]);
	}
	// cout<<endl;
	LL Loc=0;
	FOR(i,2,Len) {
		Loc=max(Loc,Height[i]);
		Max[Height[i]]=max(Max[Height[i]],Lmax[i]*Rmax[i]);
        Max[Height[i]]=max(Max[Height[i]],Lmin[i]*Rmin[i]);
		Pair[Height[i]]+=(R[i]-i)*(i-L[i]);
	}	
	FOR(i,Loc+1,Len) Max[i]=0;
	BOR(i,Loc-1,0) Max[i]=max(Max[i],Max[i+1]),Pair[i]+=Pair[i+1];
	// cout<<endl;
    // FOR(i,1,Len) cout<<L[i]<<" "<<R[i]<<" "<<Lmin[i]<<" "<<Lmax[i]<<" "<<Rmin[i]<<" "<<Rmax[i]<<endl;
    // cout<<endl;
    FOR(i,0,Len-1) printf("%lld %lld\n",Pair[i],Max[i]);
}

int main() {
    //File();
    scanf("%lld",&Len);
    scanf("%s",Temp+1);
    
    Get_Sa(); Get_Height();
    // cout<<endl;
    // FOR(i,0,Len) printf("%lld %lld %lld\n",Sa[i],Rank[i],Height[i]);
    // cout<<endl;
	FOR(i,1,Len) scanf("%lld",&Num[Rank[i]]);
    Init();
    //fclose(stdin); fclose(stdout);
   // system("pause");
    return 0;
}
2020/7/24 13:24
加载中...