小红的字符串构造
小红希望你构造一个长度为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]
。