Codeforces Round #506 (Div. 3) A-C
Posted fridayfang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #506 (Div. 3) A-C相关的知识,希望对你有一定的参考价值。
CF比赛题解(简单题)
简单题是指自己在比赛期间做出来了
A. Many Equal Substrings
题意
- 给个字符串t,构造一个字符串s,使得s中t出现k次;s的长度最短
- 如t="cat",k=3, minlen(s)=9,s=catcatcat
1<=len(t),k<=50
题解
- 稍加思考是个前缀等于后缀的问题,用kmp的next数组模板
- 假设t[0..l-1]==t[n-l....n-1]
- 那么应该不断重复t[l...n-1]这样的子串
- 代码如下(应该好好记住kmp模板,自己还有点慌张)
#include<bits/stdc++.h>
int n,k;
char t[52];
int next[52];
char tar[2510];
//前缀和后缀相等
void kmp_next(int m,char x[]){
int i,j;
j=next[0]=-1;
i=0;
while(i<m){
while(-1!=j &&x[i]!=x[j]) j=next[j];
next[++i]=++j;
}
}
void db(){
printf("db:
");
for(int i=0;i<=n;i++){
printf("%d ",next[i]);
}
}
int main(){
scanf("%d %d",&n,&k);
scanf("%s",t);
kmp_next(n,t);
int prefix=next[n];//[0..prefix-1] == [n-1-prefix+1,n-1]
//repeat [prefix...n-1]
//printf("db pre:%d
",prefix);
int q=0;
for(int i=0;i<prefix;i++){
tar[i]=t[i];
q++;
}
for(int j=0;j<k;j++){
for(int m=prefix;m<n;m++){
tar[j*(n-prefix)+m]=t[m];
q++;
}
}
tar[q]='