一道莎莎的交互题(开篇第一课)

Guess Strings

题目地址

题意

大致意思是给你一个字符串S,有两个字符组成(没错!题目错的!md)长度是2~100,然后每一次可以询问一个字符串s,如果s是S的子串,返回1;反之返回0,在询问不超过200次的前提下得出答案!

题解

没得说了,先找到字符,然后往前找,再往后找,就ok了,不懂想一下就懂了(注意字串)。

意义

很简单的题目,放上来的主要意义在于之前没写过这一类的交互题,而且还是随机数生成结果,因为只有两个字符所以期望是50%和50%,直接for的话必TLE,嗯,没其他的了。

AC代码

#include<bits/stdc++.h>
using namespace std;

int ask(string s){
    cout<<"ASK "<<s<<endl;
    fflush(stdout);//交互题目重点
    //也可以写成cout.flush()和cin.flush() 
    int a;
    cin>>a;
    return a;
} 

int create(int i){
    return (unsigned long long)rand()*(unsigned long long)rand()%i;//更加随机生成数 
}
int main(){
    
    srand((int)time(NULL));//产生随机数,不加这个多次会不随机 
    int number=0;
    string have[2];
    
    for(int i=0;i<26;i++){
        if(number==2)break;
        string s;
        s+=('a'+i);
        int res=ask(s);
        if(res==1){
            have[number++]=s;
        }
    }//找到字符 

    string s;
    s=have[0]+have[1];
    if(!ask(s))reverse(s.begin(),s.end());//判断长度为2时的情况 
    
    while(1){//往后找 
        int pos=create(2); 
        string temp=s+have[pos];
        if(ask(temp)){
            s=temp;
        }else {
            temp=s+have[pos^1];
            if(ask(temp)){
                s=temp;    
            }else {
                break;
            }
        }
    }
    
    while(1){//往后找 
        int pos=create(2); 
        string temp=have[pos]+s;
        if(ask(temp)){
            s=temp;
        }else {
            temp=have[pos^1]+s;
            if(ask(temp)){
                s=temp;    
            }else {
                break;
            }
        }
    }
    
    cout<<"ANSWER "<<s<<endl;
    return 0; 
}

暂时先这样写吧,其他修改后面再补

作者:第三个草

posted @ 2021-04-01 20:02  Fire_WCNMD  阅读(66)  评论(0)    收藏  举报