题意:给定一个字符串何一个k,然后是否可以变成这种形式
$$
s=a{_1}+a{_2}+.......+a{_k}+a{_{k+1}}+R(a{_{k-1}})+......+R(a{_{1}})
$$
R代表对字符串reverse.
思路:中间字符串可以是任意长度,所以考虑其他字符串长度都是1.然后从左和从右开始匹配,看是否存在可以匹配上k组,同时中间长度不为0.
#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define fel(i,x,y) for(int i=x;i<=y;i++)
#define fhl(i,x,y) for(int i=x;i>=y;i--)
#define inf 0x3fffffff
#define ll long long
#define pb push_back
#define endl "\n"
#define int long long
string s;
int n,k;
题意:就是存在一个多重集合s,然后每次可以把mex(s)和max(s)的和除以2向上取整放入集合问最后集合中的不同元素个数。
思路:首先考虑这种情况0,1,2,3,4。那下一次加入的值就是(5+4)/2上取整就是5,所以这种数列每次都会添加一个新值。这样答案就是s,size()+k
第二种情况就是mex(s)是小于集合中的最大值的。如果添加的数是集合中原来不存在的数那是有可能更行mex(s)的值的。比如0 , 2,就会添加1.
但是如果你添加的值是原来集合中有的,那mex和max都不会更新了。那每次添加的值就是相同的了。
#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define fel(i,x,y) for(int i=x;i<=y;i++)
#define fhl(i,x,y) for(int i=x;i>=y;i--)
#define inf 0x3fffffff
#define ll long long
#define pb push_back
#define endl "\n"
#define int long long
int n,k;
set<int>s;
map<int,int>mp;
void slove(){
cin>>n>>k;
int mx=-1;
mp.clear();
s.clear();
for(int i=1,x;i<=n;i++){
cin>>x;
mp[x]=1;
s.insert(x);
mx=max(x,mx);
}
int cnt=0;
for(int i=0;i<=mx;i++){
if(mp[i]){
cnt++;
}
else break;
}
if(cnt==mx+1){
cout<<mx+1+k<<endl;
return;
}
for(int i=1;i<=k;i++){
int t1=0;
for(int j=0;j<=mx;j++){
if(mp[j]==0){
t1=j;
break;
}
}
t1=ceil(1.0*(t1+mx)/