Codeforces Round #506 (Div. 3)
Posted kisekipurin2019
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #506 (Div. 3)相关的知识,希望对你有一定的参考价值。
题目链接:https://codeforces.com/contest/1029
A - Many Equal Substrings
题意:给一个长度为 (n(1leq nleq50)) 的字符串 (t) ,和一个正整数 (k(1leq kleq50)) ,要求构造一个最短的字符串 (s) ,使得 (t) 在 (s) 中恰好出现 (k) 次。
题解:看起来就像KMP算法,来个 (O(n^3)) 的做法就可以了,枚举重叠部分的两个开始位置,然后判断是否重叠,用此找出最长的重叠位置。但是直接复制一个前缀函数来用最简单。
在模板中提供的前缀函数是要求从0开始的,而 (pi(n)) 即为整个字符串除去字符串本身的首尾重叠的最长长度。
注意留够空间。
int pi[3005];
void GetPrefixFunction(char *s, int sl) {
pi[0] = 0, pi[1] = 0;
for(int i = 1, k = 0; i < sl; ++i) {
while(k && s[i] != s[k])
k = pi[k];
pi[i + 1] = (s[i] == s[k]) ? ++k : 0;
}
}
char s[3005];
void test_case() {
int n, k;
scanf("%d%d%s", &n, &k, s);
GetPrefixFunction(s, n);
int p = pi[n];
int top = n;
--k;
while(k--) {
for(int i = 0; i < n - p; ++i) {
s[top] = s[top - (n - p)];
++top;
}
}
s[top] = '