D.求構造一個長度爲n的字符串使得此字符串中最小”獨特“子串的長度爲k 數據滿足n>=k 且n與k奇偶性相同
http://codeforces.com/contest/1159/problem/D
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,k;
string cal(int n,int k)
{
int v=(n-k)/2;
string res="";
while(res.size()+(v+1)<=n)
{
int t1=v;
while(t1--)res+='1';
res+='0';
}
while(res.size()<n)res+='1';
return res;
}
int main()
{
cin>>n>>k;
cout<<cal(n,k)<<endl;
return 0;
}
E. 給出一個長度爲n的數列,指的是右邊第一個大於該位置的數所在位置,若爲-1指的是不清楚(都行),讓你把原來的長度爲n的全排列還原回去。
http://codeforces.com/contest/1159/problem/E
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int T;
int a[500050];int n;
int position[500005];int b[500005];
bool ok=1;int pos=1;
int cnt=0;
//每次尋找能填的最小位置填上去
void dfs(int p,int limit)
{
if(a[p]>limit){ok=0;return;}
pos++;
while(ok&&pos<a[p])dfs(pos,a[p]);
position[++cnt]=p;
}
int main()
{
ios_base::sync_with_stdio(0);
cin>>T;
while(T--)
{
pos=1;ok=1;cnt=0;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
while(ok&&pos<=n)
{
dfs(pos,n+1);
}
if(!ok){cout<<-1<<endl;continue;}
else {
for(int i=1;i<=n;i++)b[position[i]]=i;
for(int i=1;i<=n;i++)cout<<b[i]<<" ";
cout<<endl;
}
}
return 0;
}