线性最长cover(无讲解)

本文深入探讨了K长Cover算法与Fail树的概念及其应用,通过详细的代码示例,解析了如何在字符串匹配中利用这些算法进行高效处理。文章涵盖了算法的基本原理、实现步骤及关键代码片段,为读者提供了全面的理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 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级祖先,长剖即可。

转载于:https://www.cnblogs.com/GreenDuck/p/10976271.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值