1511D. Min Cost String
需求数组放在char res[]里。
-
理解过后不难看出要求构造一个字符串,字符串要求Si+S(i+1) != Sj+S(j+1)。
-
最初理解是将a放在res[0]里,后面依次放入一对与前面不同的字符,如k==4的时候字符串为aabacadbcbdcd。--wa了直接--
-
画图分析以后发现每到达下一个字母时应该把当前字母也放进去k=4的时候就变成了aabacadbbcbdccddd。--ac了直接--
上Google看别的代码的时候发现这个好像叫欧拉回路大小为k * k--(完全看不懂--。
ac🐎
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1000010;
int n;
int k;
char res[N];
int idx1 = 0,idx2 = 1;
int m;
int main(){
cin >> n >> k;
if(k >= n){
for(int i = 0;i < n;i ++) printf("%c",'a' + i);
return 0;
}
m = k * (k - 1) >> 1;
res[0] = 'a';
for(int i = 1;i <= min(m * 2 + k,n);i += 2){
res[i] = 'a' + idx1;
res[i + 1] = 'a' + idx2 ++;
if(idx2 == k){
idx1 ++;
i += 2;
res[i] = 'a' + idx1;
i --;
idx2 = idx1 + 1;
}
}
for(int i = 0,cnt = 0;i < n;i ++){
printf("%c",res[cnt ++]);
if(cnt >= m * 2 + k) cnt = 0;
}
return 0;
}