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;
}

浙公网安备 33010602011771号