又着重复习了以下KMP算法的next数组求解,一定要记住模板,除了next[0]=-1,其余的next[i]都是指目标串中:对于前i-1个字符,即最长相等前后缀的字符数。
再写一遍next数组求法:
void find_next(string s,int next_[]){
int i=0,j=-1;//初始化
next_[0]=-1;
while(i<s.size()){//正文
if(j==-1||s[i]==s[j]){
i++;
j++;
next_[i]=j;
}
else{
j=next_[j];
}
}
}
这道题怎么应用next数组呢?例如:t串为ababa,当打印完第一遍字符串后,应该跳到第四个字符‘b’,b的位置是由求整个t串的最长相等前后缀的字符数,即next[5]的值。next[5]=3,即ababa的前3个字符和后3个字符相等。那么我们需要跳过3个字符,继续第二轮输出,只需要输出ba即可。第三轮,第四轮都是ba...
#include<bits/stdc++.h>
using namespace std;
string s,t;
int n,k;
int next_[100010];
void find_next(){
int j=-1,i=0;
next_[0]=-1;
while(i<=t.size()){
if(j==-1||t[i]==t[j]){
i++;
j++;
next_[i]=j;
}
else{
j=next_[j];
}
}
}
int main( )
{
cin>>n>>k>>t;
find_next();
int turn=0;
int i=0;
while(turn<k){
while(i<t.size()){
cout<<t[i++];
}
i=next_[i];
turn++;
}
return 0;
}