CF873F 【Forbidden Indices】

还有这么板子的题?

和你谷上后缀自动机的板子基本一样,区别就是之后这个位置是\(0\)才计入贡献

代码

#include<iostream>
#include<cstdio>
#define maxn 400005
#define re register
#define LL long long
#define max(a,b) ((a)>(b)?(a):(b))
char S[maxn>>1],T[maxn>>1];
int n,lst=1,cnt=1;LL ans;
int fa[maxn],len[maxn],sz[maxn],tax[maxn],a[maxn],son[maxn][26];
inline void ins(int c,int o) {
   int p=++cnt,f=lst; lst=p;
   len[p]=len[f]+1,sz[p]=o;
   while(f&&!son[f][c]) son[f][c]=p,f=fa[f];
   if(!f) {fa[p]=1;return;}
   int x=son[f][c];
   if(len[f]+1==len[x]) {fa[p]=x;return;}
   int y=++cnt;
   len[y]=len[f]+1,fa[y]=fa[x],fa[x]=fa[p]=y;
   for(re int i=0;i<26;i++) son[y][i]=son[x][i];
   while(f&&son[f][c]==x) son[f][c]=y,f=fa[f];
}
int main()
{
   scanf("%d",&n);scanf("%s",S+1),scanf("%s",T+1);
   for(re int i=1;i<=n;i++) ins(S[i]-'a',int(T[i]-'0')^1);
   for(re int i=1;i<=cnt;i++) tax[len[i]]++;
   for(re int i=1;i<=n;i++) tax[i]+=tax[i-1];
   for(re int i=1;i<=cnt;i++) a[tax[len[i]]--]=i;
   for(re int i=cnt;i;i--) sz[fa[a[i]]]+=sz[a[i]];
   for(re int i=1;i<=cnt;i++) ans=max(ans,(LL)sz[i]*(LL)len[i]);
   std::cout<<ans;
   return 0;
}

posted @ 2019-02-12 16:51  asuldb  阅读(211)  评论(0编辑  收藏  举报