← Home
#include <bits/stdc++.h>
using namespace std;
const int N=114514,S=2;
struct sam{
	int lst,tot,lnk[N]={-1},len[N],ch[N][S];
	void clr(){
		for(int i=0;i<=tot;i++) fill_n(ch[i],S,0);
		lst=tot=0;
	}
	void ins(int c){
		int p=lst,u=++tot;
		len[lst=u]=len[p]+1;
		while(~p&&!ch[p][c]) ch[p][c]=u,p=lnk[p];
		if(p==-1) {lnk[u]=0;return;}
		int q=ch[p][c];
		if(len[p]+1==len[q]) {lnk[u]=q;return;}
		int nq=++tot;copy_n(ch[q],S,ch[nq]);
		lnk[nq]=lnk[q];len[nq]=len[p]+1;lnk[q]=lnk[u]=nq;
		while(~p&&ch[p][c]==q) ch[p][c]=nq,p=lnk[p];
	}
	int val(){
		int res=0;
		for(int i=1;i<=tot;i++) res+=len[i]-len[lnk[i]];
		return res;
	}
}T;
int calc(string s){
	T.clr();
	for(auto x:s) T.ins(x=='X');
	return T.val();
}
int main(){
	mt19937 rnd(time(0));
	int n;
	cin>>n;
	vector<string> s;
	map<int,array<int,2>> mp;
	while(1){
		s.clear();mp.clear();
		for(int i=0;i<n;i++){
			int len=n*20+rnd()%(n*10+1);
			string t;
			while(len--) t+=rnd()%10?'X':'O';
			s.push_back(t);
		}
		for(int i=0;i<n;i++) for(int j=0;j<n;j++) mp[calc(s[i]+s[j])]={i,j};
		if((int)mp.size()==n*n) break;
	}
	for(auto x:s) cout<<x<<endl;
	cin>>n;
	for(int x;n--;) cin>>x,cout<<mp[x][0]+1<<" "<<mp[x][1]+1<<endl;
	return 0;
}