小紅的字符串構造
小紅希望你構造一個長度為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]
。