https://codeforces.com/problemset/problem/1117/E
就用abc表示数字来给每个数编码,编完直接问出移动的结果,反构造就行了,比C和D还简单。
#include<bits/stdc++.h> using namespace std; #define ll long long int n; string s1,s2,s3; string t; string q1,q2,q3; int pos[10005]; char s[10005]; void construct(){ for(int i=0;i<n;i++){ s1+=(char)('a'+i%26); } int i=0; for(int p=0;p<n;){ for(int j=0;j<26&&p<n;j++,p++){ s2+=(char)('a'+i%26); } i++; } i=0; for(int p=0;p<n;){ for(int j=0;j<26*26&&p<n;j++,p++){ s3+=(char)('a'+i%26); } i++; } //cout<<s1<<endl<<s2<<endl<<s3<<endl; } void solve(){ for(int i=0;i<n;i++){ int pp=0; pp+=(q3[i]-'a'); pp*=26; pp+=(q2[i]-'a'); pp*=26; pp+=(q1[i]-'a'); pos[i]=pp; } /*for(int i=0;i<n;i++){ cout<<pos[i]<<" "; } cout<<endl;*/ for(int i=0;i<n;i++){ s[pos[i]]=t[i]; } s[n]='\0'; cout<<"! "<<s<<endl; fflush(stdout); } int main(){ cin>>t; n=t.length(); construct(); cout<<"? "<<s1<<"\n"; fflush(stdout); cin>>q1; cout<<"? "<<s2<<"\n"; fflush(stdout); cin>>q2; cout<<"? "<<s3<<"\n"; fflush(stdout); cin>>q3; solve(); }