题解:P11276

题面

P11276

![[../../题面/洛谷题面/P11276|P11276]]

前言

这道题是 \(\text{kmp}\) 模板题(P3375)的子任务

具体地,该题考虑用模式串自己匹配自己,用 \(\text{kmp}\) 失调指针 \(O(n)\) 找到字符串最长的能与真后缀完全匹配的真前缀,我们称之为 \(\text{border}\)

过程(待补)

  1. \(\text{kmp}\) 找到最长 \(\text{border}\)

  2. 输出原字符串

  3. 输出原字符串删去最长 \(\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;
}

posted @ 2025-08-20 20:55  badn  阅读(4)  评论(0)    收藏  举报