Advertisement
yicongli

LG2178

Apr 6th, 2019
200
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.03 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define gc c=getchar()
  6. #define r(x) read(x)
  7. #define ll long long
  8.  
  9. template<typename T>
  10. inline void read(T&x){
  11.     x=0;T k=1;char gc;
  12.     while(!isdigit(c)){if(c=='-')k=-1;gc;}
  13.     while(isdigit(c)){x=x*10+c-'0';gc;}x*=k;
  14. }
  15.  
  16. const int N=6e5+7;
  17. const int INF=1e9;
  18.  
  19. int tot;
  20. int len[N],fa[N],trans[N][26],siz[N];
  21. int mx[N],_mx[N],mi[N],_mi[N];
  22. vector<int>G[N];
  23.  
  24. inline int NewNode(int l,int *tr,int su){
  25.     ++tot;
  26.     fa[tot]=su;
  27.     len[tot]=l;
  28.     mi[tot]=_mi[tot]=INF;
  29.     mx[tot]=_mx[tot]=-INF;
  30.     if(tr!=NULL)memcpy(trans[tot],tr,26<<2);
  31.     return tot;
  32. }
  33.  
  34. inline int Extend(int u,int c){
  35.     int t=NewNode(len[u]+1,NULL,0);
  36.     for(;u&&!trans[u][c];u=fa[u])trans[u][c]=t;
  37.     if(!u){
  38.         fa[t]=1;
  39.         return t;
  40.     }
  41.     int v=trans[u][c];
  42.     if(len[v]==len[u]+1){
  43.         fa[t]=v;
  44.         return t;
  45.     }
  46.     int x=NewNode(len[u]+1,trans[v],fa[v]);
  47.     fa[t]=fa[v]=x;
  48.     for(;u&&trans[u][c]==v;u=fa[u])trans[u][c]=x;
  49.     return t;
  50. }
  51.  
  52. inline void Max(int x,int v){
  53.     if(v>=mx[x])_mx[x]=mx[x],mx[x]=v;
  54.     else if(v>_mx[x])_mx[x]=v;
  55. }
  56.  
  57. inline void Min(int x,int v){
  58.     if(v<=mi[x])_mi[x]=mi[x],mi[x]=v;
  59.     else if(v<_mi[x])_mi[x]=v;
  60. }
  61.  
  62. ll sum[N],ans[N];
  63.  
  64. void dfs(int x){
  65.     for(int i=0;i<G[x].size();++i){
  66.         int v=G[x][i];
  67.         dfs(v);
  68.         sum[len[x]]+=(ll)siz[x]*siz[v];
  69.         siz[x]+=siz[v];
  70.         Max(x,mx[v]);
  71.         Max(x,_mx[v]);
  72.         Min(x,mi[v]);
  73.         Min(x,_mi[v]);
  74.     }
  75.     if(siz[x]>1)ans[len[x]]=max(ans[len[x]],max((ll)mx[x]*_mx[x],(ll)mi[x]*_mi[x]));
  76. }
  77.  
  78. int w[N];
  79. char s[N];
  80.  
  81. int main(){
  82.     int n;r(n);
  83.     scanf("%s",s);
  84.     for(int i=0;i<n;++i)r(w[i]);
  85.     int lst=NewNode(0,NULL,0);
  86.     for(int i=n-1;~i;--i){
  87.         lst=Extend(lst,s[i]-'a');
  88.         mx[lst]=mi[lst]=w[i];
  89.         siz[lst]=1;
  90.         ans[i]=-1e18;
  91.     }
  92.     for(int i=2;i<=tot;++i)G[fa[i]].push_back(i);
  93.     dfs(1);
  94.     for(int i=n-2;~i;--i){
  95.         sum[i]+=sum[i+1];
  96.         ans[i]=max(ans[i],ans[i+1]);
  97.     }
  98.     for(int i=0;i<n;++i){
  99.         printf("%lld %lld\n",sum[i],sum[i]?ans[i]:0);
  100.     }
  101. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement