[cf873F]Forbidden Indices

对于没有标记的节点记为1,标记的节点记为0,然后同spojSUBLEX

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define N 200005
 4 int last,V,a[N<<1],sz[N<<1],len[N<<1],fa[N<<1],ch[N<<1][31],id[N<<1];
 5 char s[N],s1[N];
 6 void add(int c,int pd){
 7     int p=last,np=last=++V;
 8     sz[V]=(pd^1);
 9     len[V]=len[p]+1;
10     for(;(!ch[p][c])&&(p);p=fa[p])ch[p][c]=np;
11     if (!p)fa[np]=1;
12     else{
13         int q=ch[p][c];
14         if (len[q]==len[p]+1)fa[np]=q;
15         else{
16             int nq=++V;
17             len[nq]=len[p]+1;
18             memcpy(ch[nq],ch[q],sizeof(ch[q]));
19             fa[nq]=fa[q];
20             fa[q]=fa[np]=nq;
21             for(;(p)&&(ch[p][c]==q);p=fa[p])ch[p][c]=nq; 
22         }
23     }
24 }
25 int main(){
26     V=last=1;
27     scanf("%*d%s%s",s,s1);
28     for(int i=0;s[i];i++)add(s[i]-'a',s1[i]-'0');
29     for(int i=1;i<=V;i++)a[len[i]]++;
30     for(int i=0;s[i];i++)a[i+1]+=a[i];
31     for(int i=1;i<=V;i++)id[a[len[i]]--]=i;
32     for(int i=V;i;i--)sz[fa[id[i]]]+=sz[id[i]];
33     long long ans=0;
34     for(int i=1;i<=V;i++)ans=max(ans,1LL*sz[i]*len[i]);
35     printf("%lld",ans);
36 }
View Code

猜你喜欢

转载自www.cnblogs.com/PYWBKTDA/p/11254626.html