题目链接:https://codeforces.com/contest/1282/problem/D
题目大意:
交互题,每次输出一个字符串,然后会返回一个数字,表示输出的字符串和答案之间的编辑距离,编辑距离的定义是一个字符串使用插入、删除、替换变成另一个字符串的最小次数。希望能在答案字符串的长度+2的询问次数内找到答案字符串
题目思路:
看到rating2300后被吓退的某菜鸡。。。感谢卿学姐的讲解:传送门
讲道理,其实并不是很难。。首先先得得到答案的长度,先输出一个a,然后就会得到一个数字n,然后输出n+1长度的a,又得到一个数字m,除非全是b,否则这个数字一定会变小或不变,如果变大的话那就直接输出n个b,否则就获悉答案是一个长度为n+1的字符串,然后每次变动一个字母,观察返回的数字是否变小,如果变小那就改成b,否则保持a。
一个坑点,题目说了,输出的字符串长度不能超过300,所以如果输出a返回的数字是300的话,不能输出301个a,否则就wa了,这个时候可以发现,答案字符串最多也就300个字符,那肯定答案就是300个b。
以下是代码:
#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define per(i,a,b) for(int i=a;i>=b;i--)
#define ll long long
const int MAXN = 2e5+5;
const int MOD = 10007;
string s;
int main(){
cout<<"a"<<endl;
cout.flush();
int n,m;
scanf("%d",&n);
if(!n)return 0;
if(n==300){
rep(i,1,300)cout<<"b";
cout<<endl;
cout.flush();
scanf("%d",&m);
if(!m)return 0;
}
string s="";
rep(i,1,n+1)s+="a";
cout<<s<<endl;
cout.flush();
scanf("%d",&m);
if(!m)return 0;
if(n<m){
rep(i,1,n)cout<<"b";
cout<<endl;
cout.flush();
scanf("%d",&n);
if(!n)return 0;
}
else{
rep(i,0,n){
s[i]='b';
cout<<s<<endl;
cout.flush();
int x;
scanf("%d",&x);
if(!x)return 0;
if(x<m){
m=x;
}
else s[i]='a';
}
}
}