zoukankan      html  css  js  c++  java
  • 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;
    }
    
    
  • 相关阅读:
    校外实习-7.28
    校外实习-7.27
    校外实习-7.26
    校外实习-7.25
    校外实习-第三周总结
    校外实习-7.22
    校外实习-7.21
    校外实习-7.20
    作业九—总结
    结对编程项目---四则运算(截图总结篇)
  • 原文地址:https://www.cnblogs.com/asuldb/p/10365846.html
Copyright © 2011-2022 走看看