解法
找到最长的公共前后缀以后,我们可以先输出t,然后t中的最长公共前后缀无需再输出(重复),只输出不重复的部分即可。
比如 aba公共前后缀为a ,不重复的部分为ba,所以你只需要先输出t(aba),再输出k-1个ba 就能构造出这样的字符串。
建议CSDN自学下string用法。(当然不用string也能写)
注:上述解法来自南阳理工oj官方公告
AC代码如下:
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
int n,k;
cin>>n>>k;
string str,ans;
int res = 0;//最大前缀
int temp = 0;//最大后缀
cin>>str;
for(int i = str.length()-1;i>=1;i--)//遍历一下
{
//substr()方法用于字符串的截取
if(str.substr(0,i) == str.substr(str.length()-i,i))
{
res = i;
temp = i;
break;//找到最大的了
}
}
ans = str;
k--;
while(k--)
ans += str.substr(temp,n);
cout<<ans<<endl;
return 0;
}
我们的目标是找到最大前缀 与 最大后缀!
从代码中看,似乎只用到了temp(最大后缀),res(最大前缀)没有用到,其实:temp = res,因为一个是从后面向前数,一个是从前面向后数,记录的都是个数。
之所以用temp是因为更加方便(为什么方便请看题解,应该就可以理解了,滑稽保命)
接下来,补充一下substr的用法:
substr()方法用于字符串的截取
两个参数用法:
字符串.substr(参数1,参数2)
参数1(可以是0、正整数、负数)
参数1:
-
如果是0或正整数,则代表字符串截取的起始下标
-
如果是负数,则代表从倒数第几个字符开始截取
参数2:
-
字符串截取字符的个数(正整数)
-
如果是0或负数,则会返回空字符串
还有一个参数的用法:
字符串.substr(参数);
参数:
- 如果是0或正整数:字符串截取的起始下标,默认截取至字符串结尾
- 如果是负数:则从倒数第几个字符开始截取,默认截取至字符串结尾
所以通过substr,我们遍历一下,就可以得到temp 与 res!(前面的一段 是否 等于 后面的一段)
根据题意:
我们先输出str(你输入的字符串)
接下来我们只需要输出k-1个 str.substr(temp,n)就可以了。
最后感谢您的阅读!!!