两天木有做过题了。。。。上实验课的时候木有事干,做了一题。。坑爹的是最后居然上不了网。。。还好回宿舍一交就过了。。
/*
zoj_1009 模拟
做了好久才出来。。一开始完全看不懂题目。。
借用某牛题目解释:
分析上面的图,可得转盘的输入x和输出x'之间的关系是偏移关系,即x'=x+dx;
因此我们把映射关系中的偏移量dx用一个数组表示:
int rotor[m]; 这个数组中的负数也可以通过加上m矫正为正数。
例如上图中的映射关系为BADFEC,用偏移量数组表示为{1, -1, 1, 2, 0, 3},
当rotor转动一格时,相当于该数组循环向右移动一格,变为{3, 1, -1, 1, 2, 0};
该题需要注意的一点是这题逆过来了,从转子三开始考虑,所以偏移量需要逆转过来,具体见change()函数
其他基本上直接模拟就行
*/
#include <iostream>
#include <cstdio>
#include <string>
using namespace std;
string s[3];
int rotor[3][60];
string model="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
int co1,co2,co3;
void change( int n )
{
int i,j,t,temp[3][60];
for( i=0;i<3;i++ )
{
for( j=0;j<n;j++ )
{
t=j+rotor[i][j];
temp[i][t]=-rotor[i][j];
temp[i][t]=( temp[i][t]+n )%n ;
}
}
for( i=0;i<3;i++ )
{
for( j=0;j<n;j++ )
rotor[i][j+n]=rotor[i][j]=temp[i][j];
}
}
void output( char c,int n )
{
int i,t,sta[3];
sta[2]=n-co3;
sta[1]=n-co2;
sta[0]=n-co1;
/* for( i=2;i>=0;i-- )
cout<<sta[i];
cout<<endl;*/
for( i=2;i>=0;i-- )
{
t=rotor[i][ sta[i]+c-'A' ];
c='A'+( c-'A'+t )%n;
}
co1++;
if( co1==n )
{
co2++;
co1=0;
if( co2==n )
{
co3++;
co2=0;
if( co3==n )
co3=0;
}
}
cout<<char( c-('A'-'a') );
}
int main()
{
int n,m,i,j,first,count;
string temp;
first=1;
while( cin>>n && n )
{
for( i=0;i<3;i++ )
{
cin>>s[i];
for( j=0;j<n;j++ )
rotor[i][j]=s[i][j]-model[j];
}
change( n );
/*for( i=0;i<3;i++ )
{
for( j=0;j<n;j++ )
cout<<rotor[i][j]<<" ";
cout<<endl;
}*/
cin>>m;
if( first!=1 ) cout<<endl;
cout<<"Enigma "<<first<<":\n";
while( m-- )
{
cin>>temp;
co1=co2=co3=0;
for( i=0;i<temp.size();i++ )
{
output( temp[i],n );
}
cout<<endl;
}
first++;
}
return 0;
}