蒟蒻表示很懵逼
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;
}