Many Equal Substrings
题面翻译
题目描述:
你有一个字符串t,它由n个字母组成。
定义一个字符串s的子串为s[l…r],表示从位置l到r构成的一个新的串。
你的目标是构造一个字符串s,使得它的可能长度最小,要求s中存在k个位置i,可以找到k个以i为出发点的子串t。
输入: 第一行输入两个整数n和k,表示t的长度和需要k个子串
第二行输入字符串t
输出:
输出满足条件的长度最小的s。题目保证答案唯一。
题目描述
You are given a string $ t $ consisting of $ n $ lowercase Latin
letters and an integer number $ k $ .Let’s define a substring of some string $ s $ with indices from $ l $
to $ r $ as $ s[l \dots r] $ .Your task is to construct such string $ s $ of minimum possible length
that there are exactly $ k $ positions $ i $ such that $ s[i \dots i +
n - 1] = t $ . In other words, your task is to construct such string $
s $ of minimum possible length that there are exactly $ k $ substrings
of $ s $ equal to $ t $ .It is guaranteed that the answer is always unique.
输入格式
The first line of the input contains two integers $ n $ and $ k $ ( $
1 \le n, k \le 50 $ ) — the length of the string $ t $ and the number
of substrings.The second line of the input contains the string $ t $ consisting of
exactly $ n $ lowercase Latin letters.输出格式
Print such string $ s $ of minimum possible length that there are
exactly $ k $ substrings of $ s $ equal to $ t $ .It is guaranteed that the answer is always unique.
样例 #1
样例输入 #1
3 4 aba
样例输出 #1
ababababa
样例 #2
样例输入 #2
3 2 cat
样例输出 #2
catcat
看到这道题要求的答案,想到了熟悉的循环节问题,就从这入手吧。
还是先求出来
t
t
t的最小的循环节(记作
p
p
p),并根据
k
k
k进行多次构造。
但是,通过样例一可以发现,构造出来的
s
s
s可能不是恰好由整数个
p
p
p构成。
看样例一,可以发现最后恰好是由
p
m
t
[
n
−
1
]
pmt[n-1]
pmt[n−1]构成。
根据题意,可以总结出:前面输出
k
−
1
k-1
k−1个循环节,后面输出
t
t
t即可。
因为前面的
k
−
1
k-1
k−1个循环节首尾相连,已经是构成了
k
−
1
k-1
k−1个
t
t
t结构了。
AC代码
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
const int MAXN=1e6+10;
int pmt[MAXN],n,k;
void get_pmt(const string &s){
for(int i=1,j=0;i<s.length();i++){
while(j&&s[i]!=s[j])j=pmt[j-1];
if(s[i]==s[j])j++;
pmt[i]=j;
}
}
int main(){
ios::sync_with_stdio(0),cin.tie(0);
string s;
cin>>n>>k>>s;
get_pmt(s);
for(int i=1;i<=k-1;i++){
for(int j=0;j<s.length()-pmt[s.length()-1];j++){
cout<<s[j];
}
}
cout<<s;
return 0;
}