小红的字符串构造
小红希望你构造一个长度为nnn的、仅包含小写字母的字符串,其中恰好有kkk个长度大于1的回文子串。你能帮帮她吗?输入两个整数n,k,用空格隔开。 1≤n≤10^5,0≤k≤n/2.一个字符串。如果有多解输出任意即可。 可以证明,一定存在至少一个合法解。
#include<iostream>
#include<string.h>
using namespace std;
const int N = 1e6+6;
typedef long long ll;
ll n , k;
string s;
int main()
{
cin >> n >> k;
char c = 'a';
for(int i=0;i<k;i++)
{
s += c;
s += c;
c ++;
if(c > 'z') c = 'a';
}
while(s.size() < n)
{
s += c;
c ++;
if(c > 'z') c = 'a';
}
cout << s;
return 0;
}
小红的排列构造
定义两个数组a和b的汉明距离为:有多少个下标iii满足ai≠bi。例如,[2,3,1]和[1,3,1]的汉明距离是1。现在小红拿到了一个长度为n的排列p,她希望你构造一个长度为n的排列q,满足p和q的汉明距离恰好等于k。排列指长度为n的数组,其中1到n每个元素恰好出现了一次。第一行输入两个正整数n,k,代表排列p的长度,以及构造后的q和p的汉明距离。 第二行输入n个正整数pi,代表小红拿到的排列。 1≤n,k≤10^5,1≤ai≤n;如果无解,请输出-1。 否则输出n个正整数qi,代表小红构造的排列。
#include<iostream>
using namespace std;
const int N=1e5+5;
typedef long long ll;
int a[N];
int main()
{
int n,k;
cin>>n>>k;
for(int i=0;i<n;i++){
cin>>a[i];
}
if(k>n||k==1)
cout<<"-1\n";
else{
for(int i=0;i<k-1;i+=2){
swap(a[i],a[i+1]);
}
if(k%2)
swap(a[k-1],a[0]);
for(int i=0;i<n;i++){
cout<<a[i]<<" \n"[i==n-1];
}
}
return 0;
}
执行交换操作
for(int i=0;i<k-1;i+=2){ | |
swap(a[i],a[i+1]); | |
} | |
if(k%2) | |
swap(a[k-1],a[0]); |
对于 k
的每个偶数索引(从0开始),与其下一个索引(即奇数索引)进行交换。例如,如果 k=4
,则交换 a[0]
和 a[1]
,然后交换 a[2]
和 a[3]
。
如果 k
是奇数,则额外交换 a[k-1]
和 a[0]
。