版权声明:本文为博主原创文章,转载请预先通知博主(〃'▽'〃)。 https://blog.csdn.net/m0_37624640/article/details/82054428
题意:让你找里面包含m个子串s的最短串t,保证这个这个最短串是唯一的
做法:日常被卡……
举几个栗子:m = 3
aba ----> aba ba ba
abaab -----> abaab aab aab
我们发现这一类前缀和后缀相同的情况下,就是寻找最大前缀和后缀,答案就是在原s串的基础上补充m个后缀前一个字符+后缀
类似模拟kmp~
AC代码:
#include<bits/stdc++.h>
#define rep(i,s,t) for(int i = (int)(s); i <= (int)(t); i++)
#define rev(i,t,s) for(int i = (int)(t); i >= (int)(s); i--)
#define pb(x) push_back(x)
#define all(x) x.begin(),x.end()
#define sz(x) (int)(x).size()
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
const double PI = 4*atan(1.0);
const int maxn = 1e4+5;
const int INF = 0x3f3f3f3f;
const int mod = 1e9+7;
int main()
{
#ifdef LOCAL_FILE
freopen("in.txt","r",stdin);
#endif // LOCAL_FILE
ios_base::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
int n,m,len = 0,l,r;
string s;
cin>>n>>m;
cin>>s;
for(int i = n-1;i>=0;i--){
l = 0; r = n-i;
while(l<i){
if(s[l]!=s[r])
break;
l++;r++;
}
if(l == i){
len = i;
break;
}
}
cout<<s;
if(len!=0) s = s.substr(len,n-len);
for(int i=1;i<m;i++)
cout<<s;
cout<<endl;
return 0;
}