题解:P11276 第一首歌

封面

思路:

lenlenss 的长度。

通过 KMP 算法,找到最长公共前后缀长度,对于字符串 ss,它的最长公共前后缀长度是 KMP 算法使用数组 nexnex 的最后一个值 nexlen1nex_{len-1}

之后构造字符串 tt

如果最长公共前后缀长度为 00,那么 tt 只能是两个 ss 加在一起,代码实现为 t=s+s
否则 tt 就是 ss 加上 ss 中下标为最长公共前后缀长度的字符及其之后的所有字符,代码实现为 t=s+s.substr(nex[len-1])

代码:

#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define itn int
#define ull unsigned long long
string s;
int nex[1000005];
int main(){
cin>>s;
int len=s.size();
for(int i=1,j=0;i<len;i++){
while(j>0&&s[i]!=s[j])j=nex[j-1];
if(s[i]==s[j])j++;
nex[i]=j;
}
if(nex[len-1]==0)cout<<s+s;
else cout<<s+s.substr(nex[len-1]);
return 0;
}