对于没有标记的节点记为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 }