题解:P11276
题面
![[../../题面/洛谷题面/P11276|P11276]]
前言
这道题是 \(\text{kmp}\) 模板题(P3375)的子任务
具体地,该题考虑用模式串自己匹配自己,用 \(\text{kmp}\) 失调指针 \(O(n)\) 找到字符串最长的能与真后缀完全匹配的真前缀,我们称之为 \(\text{border}\)。
过程(待补)
-
\(\text{kmp}\) 找到最长 \(\text{border}\)。
-
输出原字符串
-
输出原字符串删去最长 \(\text{border}\) 前缀的字符串
好水,逃
代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+1;
using namespace std;
int kmp[N],len,pos;
char a[N];
int main()
{
cin>>a+1;
cout<<a+1;
len=strlen(a+1);
for (int i=2;i<=len;i++){
while(pos&&a[i]!=a[pos+1])pos=kmp[pos]; //自己匹配自己
if(a[pos+1]==a[i])pos++; //a[i]匹配成功,继续往后
kmp[i]=pos; //记录长度为i时,border长度
}
for(int i=kmp[len]+1;i<=len;++i)putchar(a[i]);
return 0;
}

浙公网安备 33010602011771号