• 线性最长cover(无讲解)


     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int maxn=1E6+5;
     4 int n,f[maxn],cover[maxn],R[maxn];
     5 char str[maxn];
     6 int main()
     7 {
     8     ios::sync_with_stdio(false);
     9     cin>>n;
    10     for(int i=1;i<=n;++i)
    11         cin>>str[i];
    12     int pos=0;
    13     for(int i=2;i<=n;++i)
    14     {
    15         while(pos&&str[pos+1]!=str[i])
    16             pos=f[pos];
    17         if(str[pos+1]==str[i])
    18             ++pos;
    19         f[i]=pos;
    20     }
    21     for(int i=1;i<=n;++i)
    22     {
    23         if(f[i]==0)
    24             cover[i]=R[i]=i;
    25         else
    26         {
    27             if(R[cover[f[i]]]+cover[f[i]]>=i)
    28             {
    29                 cover[i]=cover[f[i]];
    30                 R[cover[i]]=i;
    31             }
    32             else
    33                 cover[i]=R[i]=i;
    34         }
    35     }
    36     for(int i=1;i<=n;++i)
    37         cout<<cover[i]<<" ";
    38     cout<<endl;
    39     return 0;
    40 }
    View Code

    k长cover?fail树上k级祖先,长剖即可。

  • 相关阅读:
    go install
    web网络安全系统
    Web图片分享系统
    web图库网站
    web视频播放网站
    web商业银行管理平台
    web科技管理信息平台
    web工艺品销售平台
    web房产网站
    感谢!
  • 原文地址:https://www.cnblogs.com/GreenDuck/p/10976271.html
Copyright © 2020-2023  润新知