zoukankan      html  css  js  c++  java
  • 线性最长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级祖先,长剖即可。

  • 相关阅读:
    HashMap
    java反射
    arraylist和linkedlist区别
    int和Integer的区别
    java 数组排序并去重
    矩阵链乘法问题
    找零问题
    硬币收集问题
    最大借书量问题
    钢条切割问题
  • 原文地址:https://www.cnblogs.com/GreenDuck/p/10976271.html
Copyright © 2011-2022 走看看