P4391 [BOI2009] Radio Transmission 无线传输

原题链接

题解

1.当 s2 长度大于等于 s1 时,我们就令 s2 的长度为 n
2.当 len(s2)<n 时,我们令此时的 s2 无法被自我链接形成,为什么要这么设?

3.此时的 s1s2 的关系一定张这样,为什么 s2 一定开头重合? 因为我们可以把不重合的后半部分前半部分叠起来成为一个 新 s2

观察到后半部分往前移动 len(s2) 个单位长度后与前半部分重叠,也就是最长公共前后缀长度等于 nlen(s2) 的性质

code

#include<bits/stdc++.h>
using namespace std;
int lps[1000005]={0};
int main()
{
    int n;
    cin>>n;
    char s[1000006];
    cin>>(s+1);
    lps[0]=-1;
    int it=0;
    for(int i=2;i<=n;i++)
    {
        while(it>=0&&s[i]!=s[it+1]) it=lps[it];//查找最长相等前后缀,it代表i-1的已经匹配成功的相等前后缀长度(下标),it大于等于0的才有意义
        lps[i]=++it;//匹配成功,长度加一
    }

    cout<<n-lps[n];
    return 0;
}

posted @   纯粹的  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示