传送门
文章目录
- 题意:
- 思路:
题意:
思路:
首先我们发现如果知道了字符串的长度,我们就可以O(n+1)O(n+1)O(n+1)次询问求解出来。比如当前长度为nnn,那么我们就可以构造出一个长度为nnn的全′a′'a'′a′字符串,让后问一下他的花费costcostcost,之后遍历每一位,把它修改成′b′'b'′b′,看花费是否减少,如果不能减少就改回′a′'a'′a′,否则的话就更新花费。
既然如此我们考虑如何111次询问求出长度。
首先它可以插入,修改,删除。修改求长度不是很现实,我们考虑插入和删除。
首先可以询问一下′a′'a'′a′这个字符,返回值为xxx。现在无非几种情况:
(1)(1)(1)要求的串就是′a′'a'′a′,返回000,直接结束。
(2)(2)(2)要求的串全是′b′'b'′b′,那么这个串长度必须是xxx,因为这xxx个修改里面有一次是把′a′'a'′a′改成′b′'b'′b′的,剩下的都是插入′b′'b'′b′。
(3)(3)(3)要求的串有至少一个′a′'a'′a′,那么这个串长度是x+1x+1x+1,因为有一个′a′'a'′a′,还需要插入xxx个数。
当然直接按照以上思路来的话次数是O(n+3)O(n+3)O(n+3)的,因为我们要询问xxx个′b′'b'′b′的花费,还要询问x+1x+1x+1个′a′'a'′a′的花费,所以我们考虑是否能利用已经询问过的信息来解决。
考虑如果xxx个′b′'b'′b′不符合的话,假设他的返回值为yyy,那么我们知道符合条件的长度是x+1x+1x+1,那么我们需要把y−−y--y−−来增加一个长度,之后的yyy就是初始状态全为′b′'b'′b′的花费了,我们可以把之前询问全′a′'a'′a′的操作去掉,因为全′a′'a'′a′和全′b′'b'′b′是一样的,这样次数就是O(n+2)O(n+2)O(n+2)了。
//#pragma GCC optimize(2)
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
#include<cctype>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
#include<sstream>
#include<ctime>
#include<cstdlib>
#define X first
#define Y second
#define L (u<<1)
#define R (u<<1|1)
#define pb push_back
#define mk make_pair
#define Mid (tr[u].l+tr[u].r>>1)
#define Len(u) (tr[u].r-tr[u].l+1)
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define db puts("---")
using namespace std;//void rd_cre() { freopen("d://dp//data.txt","w",stdout); srand(time(NULL)); }
//void rd_ac() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//AC.txt","w",stdout); }
//void rd_wa() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//WA.txt","w",stdout); }typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;const int N=1000010,mod=1e9+7,INF=0x3f3f3f3f;
const double eps=1e-6;int x,y;
string s;
int a[1000];int main()
{
// ios::sync_with_stdio(false);
// cin.tie(0);s="a";cout<<s<<endl; cout.flush();cin>>x;string ans;for(int i=1;i<=x;i++) ans+='b';cout<<ans<<endl; cout.flush();cin>>y;y--; s="";for(int i=1;i<=x+1;i++) s+='b';int mi=INF;for(int i=0;i<s.length();i++){s[i]='a'; int now;cout<<s<<endl; cout.flush();cin>>now;if(now>y) s[i]='b';else y=now;}return 0;
}
/**/