版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liufengwei1/article/details/87827277
模拟题。。。当时没做好亏啊
我们把输入询问的3个串看做a,b,c,把返回结果看成rea,reb,rec
对于一个位置i,a[i],b[i],c[i]这个三元组就表示这个位置上一个独立的元素
只有26个字母,那么26*26*26>1e4,所以只要看a[i],b[i],c[i] -> rea[j],reb[j],rec[j]就行了
也就是应用的变换为 从 i 到 j,那么用t 求s 就是从 j 到 i 了
#include<bits/stdc++.h>
#define maxl 1000010
using namespace std;
int n;
int pos[maxl],ind[maxl];
string a,b,c,rea,reb,rec,t;
char s[maxl];
inline void prework()
{
cin>>t;
n=t.size();
a="";b="";c="";
int cnt=0;
for(int i=1;i<=26;i++)
for(int j=1;j<=26;j++)
for(int k=1;k<=26;k++)
{
a+='a'+i-1;
b+='a'+j-1;
c+='a'+k-1;
pos[(i-1)*26*26+(j-1)*26+k-1]=cnt;
++cnt;
if(cnt==n)
return;
}
}
inline void mainwork()
{
cout<<"? "<<a<<endl;
cin>>rea;
cout<<"? "<<b<<endl;
cin>>reb;
cout<<"? "<<c<<endl;
cin>>rec;
for(int i=0;i<n;i++)
{
ind[i]=pos[(rea[i]-'a')*26*26+(reb[i]-'a')*26+rec[i]-'a'];
s[ind[i]]=t[i];
}
}
inline void print()
{
cout<<"! ";
for(int i=0;i<n;i++)
cout<<s[i];
}
int main()
{
prework();
mainwork();
print();
return 0;
}