P4391 [BOI2009] Radio Transmission 无线传输

原题链接

题解

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

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

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

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 @ 2024-04-04 12:33  纯粹的  阅读(48)  评论(0)    收藏  举报