由于要找后缀的前缀,所以先用反串建立SAM。
link边组成了后缀树。
两个子串的最长公共前缀是LCA的step
树形dp即可。
 #include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#define maxn 1200000
using namespace std;
struct edge {
int to,next;
}e[maxn];
int n,a[maxn];
char s[maxn];
int head[maxn],d;
long long ans[maxn],mx[maxn],mn[maxn],sum[maxn];
struct data {
int last,cnt;
int son[maxn][],link[maxn],step[maxn],v[maxn],size[maxn];
int tmp[maxn];
data() {last=cnt=;v[]=;}
void extend(int c,int val) {
int p=last,np=last=++cnt;step[np]=step[p]+;v[np]=val,size[np]=;
while(p&&!son[p][c]) son[p][c]=np,p=link[p];
if(!p) link[np]=;
else {
int q=son[p][c];
if(step[q]==step[p]+) link[np]=q;
else {
int nq=++cnt;v[nq]=;
memcpy(son[nq],son[q],sizeof(son[q]));
link[nq]=link[q];
link[q]=link[np]=nq;
step[nq]=step[p]+;
while(son[p][c]==q&&p) son[p][c]=nq,p=link[p];
}
}
}
void add(int u,int v) {e[d].next=head[u];e[d].to=v;head[u]=d++;}
void build() {for(int i=;i<=cnt;i++) add(link[i],i),ans[i]=-21474836470000000000000LL;}
void query(int x) {
mx[x]=-;mn[x]=;
if(v[x]!=) mx[x]=mn[x]=v[x];
for(int i=head[x];i>=;i=e[i].next) {
int to=e[i].to;
query(to);
if(mx[x]!=-&&mn[x]!=&&mx[to]!=-&&mn[to]!=) ans[step[x]]=max(ans[step[x]],max(mx[x]*mx[to],mn[to]*mn[x]));
mx[x]=max(mx[x],mx[to]);mn[x]=min(mn[x],mn[to]);
sum[step[x]]+=1LL*size[x]*size[to];size[x]+=size[to];
} }
void getans() {
for(int i=n-;i>=;i--) sum[i]+=sum[i+],ans[i]=max(ans[i],ans[i+]);
for(int i=;i<=n-;i++) if(sum[i]) printf("%lld %lld\n",sum[i],ans[i]); else printf("0 0\n");
} }sam; int main() {
memset(head,-,sizeof(head));
scanf("%d",&n);
scanf("%s",s+);
for(int i=;i<=n;i++) scanf("%d",&a[i]);
for(int i=n;i>=;i--) sam.extend(s[i]-'a',a[i]);
sam.build();
sam.query();
sam.getans(); }

最新文章

  1. block为什么用copy以及如何解决循环引用
  2. Nginx配置Https
  3. Java设计模式学习笔记(观察者模式)
  4. linux查看系统信息命令
  5. 【poj1067】 取石子游戏
  6. nginx学习之一
  7. Tomcat普通用户启动注意事项
  8. JavaSE学习总结第09天_面向对象4
  9. 【LeetCode】数组-1(643)-返回规定长度k的最大子数组的平均数
  10. selenium + robotframework的运行原理
  11. 小强学渲染之OpenGL状态机理解
  12. canvas(四) Gradient- demo
  13. 洛谷 P2746 [USACO5.3]校园网Network of Schools 解题报告
  14. NIO 中的读和写
  15. 文件处理----Properties文件处理
  16. 好用的js模板
  17. js中cookie,localStorage(sessionStorage)的存取
  18. Codeforces Round #281 (Div. 2) B. Vasya and Wrestling 水题
  19. 修改oracle数据库默认时间格式
  20. ubuntu安装谷歌拼音输入法

热门文章

  1. 正则表达式之旅_sed_awk
  2. 算法(8)Maximum Product Subarray
  3. Delphi xe7组件和控件的安装方法
  4. JAVA多线程及补充
  5. arc073 F many moves(dp + 线段树)
  6. CSS网页宽度怎么定比较合适
  7. 支持jsonP的Controller写法
  8. 单个回调函数中返回多个Request以及Item
  9. SpringMVC学习 -- 使用 @RequestMapping 映射请求
  10. jquery遍历之后代