#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<fstream>
#include<map>
#include<ctime>
#include<set>
#include<queue>
#include<cmath>
#include<vector>
#include<bitset>
#include<functional>
#define x first
#define y second
#define mp make_pair
#define pb push_back
#define REP(i,l,r) for((i)=(l);(i)<=(r);++(i))
#define REP2(i,l,r) for((i)=(l);(i)!=(r);++(i))
using namespace std;
typedef long long LL;
typedef double ld;
const int MAX=300000+10;
int n;
char str[MAX];
int dx[]={0,1,0,-1};
int dy[]={1,0,-1,0};
int pre[MAX],suf[MAX],match[MAX];
void del(int u)
{
pre[suf[u]]=pre[u];
suf[pre[u]]=suf[u];
}
int que[MAX],head=0,end=0;
int hash[MAX];
int L[MAX],R[MAX],U[MAX],D[MAX];
struct Matrix
{
int l,r,u,d;
Matrix(int a=0,int b=0,int c=0,int e=0):l(a),r(b),u(c),d(e){}
};
Matrix operator + (const Matrix& a,const Matrix& b)
{
return Matrix(a.l+b.l,a.r+b.r,a.u+2+b.u+b.d,a.d);
}
int tot;
Matrix dd[MAX];
Matrix work(int l,int r)
{
int u=++tot;
Matrix ans(0,0,0,0);
if(match[l]==l+1)
{
if(str[l]=='L')
ans=Matrix(0,2,2,0);
else ans=Matrix(2,0,2,0);
}
else
{
Matrix tmp=work(l+1,match[l]-1);
if(str[l]=='L')
{
ans.d=tmp.r;
ans.u=tmp.l;
ans.r=2+tmp.u+tmp.d;
ans.l=0;
}
else
{
ans.d=tmp.l;
ans.u=tmp.r;
ans.l=3+tmp.u+tmp.d;
ans.r=0;
}
}
if(match[l]!=r)
ans=ans+work(match[l]+1,r);
dd[u]=ans;
return ans;
}
int top=0;
vector< pair<int,int> > ans;
void print(int x,int y)
{
// cout<<x<<" "<<y<<endl;
}
pair<int,int> show(int l,int r,int x,int y,int dir)//x,y灏辨槸涓婁竴涓埌杈剧殑鐐?
{
++top;
int delta=(str[l]=='P'?3:1);
int ndir=(dir+delta)%4;
if(l+1==match[l])
{
x+=dx[ndir];
y+=dy[ndir];
ans.pb(mp(x,y));
print(x,y);
x+=dx[dir];
y+=dy[dir];
}
else
{
Matrix nx=dd[top+1];
int Len=nx.d+1;
int oldx=x;
int oldy=y;
x+=dx[ndir] * Len;
y+=dy[ndir] * Len;
ans.pb(mp(x,y));
print(x,y);
show(l+1,match[l]-1,x,y,ndir);
x=ans[ans.size()-1].x;
y=ans[ans.size()-1].y;
if(dx[ndir])
ans[ans.size()-1].x=oldx+(nx.d+2+nx.u)*dx[ndir];
else
ans[ans.size()-1].y=oldy+(nx.d+2+nx.u)*dy[ndir];
x=ans[ans.size()-1].x;
y=ans[ans.size()-1].y;
int p=(str[l]=='L'?nx.l:nx.r);
if(dx[dir])
x=oldx+p*dx[dir];
else y=oldy+p*dy[dir];
}
if(match[l]+1<=r)
{
int Len=dd[top+1].d+1;
x+=dx[dir]*Len;
y+=dy[dir]*Len;
ans.pb(mp(x,y));
print(x,y);
pair<int,int> tmp=show(match[l]+1,r,x,y,dir);
x=tmp.x;
y=tmp.y;
}
else
{
ans.pb(mp(x,y));
print(x,y);
}
return mp(x,y);
}
int main()
{
#ifndef ONLINE_JUDGE
// freopen("input.txt","r",stdin);freopen("output.txt","w",stdout);
#endif
int i;
scanf("%s",str+1);
n=strlen(str+1);
int cc=0;
REP(i,1,n)
{
if(str[i]=='L')
++cc;
else cc--;
}
if(cc!=4)
{
printf("NIE\n");
return 0;
}
int rot=0;
if(str[1]=='P')
{
REP(i,1,n)
if(str[i]=='L')
{
rot=i;
rotate(str+1,str+i,str+n+1);
break;
}
}
REP(i,1,n)
{
pre[i]=i-1;
suf[i-1]=i;
}
pre[0]=n;
REP(i,1,n-1)
if(str[i]!=str[i+1])
{
que[end++]=i;
hash[i]=1;
}
while(head<end)
{
int u=que[head++];
if(suf[u] && str[suf[u]]!=str[u] && pre[suf[u]]==u && u>1)
{
match[u]=suf[u];
match[suf[u]]=u;
del(u);
del(suf[u]);
que[end++]=pre[u];
}
}
const int Len=1000000000;
// const int Len=10;
int x=0,y=0,cnt=0;
ans.pb(mp(x,y));
print(x,y);
for(i=suf[0];i;i=suf[i])
{
int r=suf[i]?(suf[i]-1):n;
int l=Len/2;
x+=dx[cnt]* l;
y+=dy[cnt]* l;
if(i+1<=r)
{
ans.pb(mp(x,y));
tot=0;
work(i+1,r);
top=0;
show(i+1,r,x,y,cnt);
if(dx[cnt])
ans[ans.size()-1].x+=dx[cnt]*l;
else
ans[ans.size()-1].y+=dy[cnt]*l;
x=ans[ans.size()-1].x;
y=ans[ans.size()-1].y;
}
else
{
x+=dx[cnt]*l;
y+=dy[cnt]*l;
ans.pb(mp(x,y));
}
cnt++;
}
ans[0].y=ans[ans.size()-1].y;
map<int,int> tx,ty;
REP(i,0,(int)ans.size()-2)
{
tx[ans[i].x]=ans[i].x;
ty[ans[i].y]=ans[i].y;
}
int d=0;
for(map<int,int>::iterator it=tx.begin();it!=tx.end();++it)
it->y=d++;
d=0;
for(map<int,int>::iterator it=ty.begin();it!=ty.end();++it)
it->y=d++;
if(rot)
rotate(ans.begin(),ans.begin()+n-rot,ans.begin()+n);
REP(i,0,(int)ans.size()-2)
printf("%d %d\n",ty[ ans[i].y ],tx[ ans[i].x ] );
return 0;
}
I2luY2x1ZGU8Y3N0ZGlvPgojaW5jbHVkZTxjc3RkbGliPgojaW5jbHVkZTxjc3RyaW5nPgojaW5jbHVkZTxhbGdvcml0aG0+CiNpbmNsdWRlPGlvc3RyZWFtPgojaW5jbHVkZTxmc3RyZWFtPgojaW5jbHVkZTxtYXA+CiNpbmNsdWRlPGN0aW1lPgojaW5jbHVkZTxzZXQ+CiNpbmNsdWRlPHF1ZXVlPgojaW5jbHVkZTxjbWF0aD4KI2luY2x1ZGU8dmVjdG9yPgojaW5jbHVkZTxiaXRzZXQ+CiNpbmNsdWRlPGZ1bmN0aW9uYWw+CiNkZWZpbmUgeCBmaXJzdAojZGVmaW5lIHkgc2Vjb25kCiNkZWZpbmUgbXAgbWFrZV9wYWlyCiNkZWZpbmUgcGIgcHVzaF9iYWNrCiNkZWZpbmUgUkVQKGksbCxyKSBmb3IoKGkpPShsKTsoaSk8PShyKTsrKyhpKSkKI2RlZmluZSBSRVAyKGksbCxyKSBmb3IoKGkpPShsKTsoaSkhPShyKTsrKyhpKSkKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnR5cGVkZWYgbG9uZyBsb25nIExMOwp0eXBlZGVmIGRvdWJsZSBsZDsKCmNvbnN0IGludCBNQVg9MzAwMDAwKzEwOwoKaW50IG47CmNoYXIgc3RyW01BWF07CmludCBkeFtdPXswLDEsMCwtMX07CmludCBkeVtdPXsxLDAsLTEsMH07CgppbnQgcHJlW01BWF0sc3VmW01BWF0sbWF0Y2hbTUFYXTsKCnZvaWQgZGVsKGludCB1KQp7CiAgICBwcmVbc3VmW3VdXT1wcmVbdV07CiAgICBzdWZbcHJlW3VdXT1zdWZbdV07Cn0KCmludCBxdWVbTUFYXSxoZWFkPTAsZW5kPTA7CmludCBoYXNoW01BWF07CgppbnQgTFtNQVhdLFJbTUFYXSxVW01BWF0sRFtNQVhdOwoKc3RydWN0IE1hdHJpeAp7CiAgICBpbnQgbCxyLHUsZDsKICAgIE1hdHJpeChpbnQgYT0wLGludCBiPTAsaW50IGM9MCxpbnQgZT0wKTpsKGEpLHIoYiksdShjKSxkKGUpe30KfTsKCk1hdHJpeCBvcGVyYXRvciArIChjb25zdCBNYXRyaXgmIGEsY29uc3QgTWF0cml4JiBiKQp7CiAgICByZXR1cm4gTWF0cml4KGEubCtiLmwsYS5yK2IucixhLnUrMitiLnUrYi5kLGEuZCk7Cn0KCmludCB0b3Q7Ck1hdHJpeCBkZFtNQVhdOwoKTWF0cml4IHdvcmsoaW50IGwsaW50IHIpCnsKICAgIGludCB1PSsrdG90OwogICAgTWF0cml4IGFucygwLDAsMCwwKTsKICAgIGlmKG1hdGNoW2xdPT1sKzEpCiAgICB7CiAgICAgICAgaWYoc3RyW2xdPT0nTCcpCiAgICAgICAgICAgIGFucz1NYXRyaXgoMCwyLDIsMCk7CiAgICAgICAgZWxzZSBhbnM9TWF0cml4KDIsMCwyLDApOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIE1hdHJpeCB0bXA9d29yayhsKzEsbWF0Y2hbbF0tMSk7CiAgICAgICAgaWYoc3RyW2xdPT0nTCcpCiAgICAgICAgewogICAgICAgICAgICBhbnMuZD10bXAucjsKICAgICAgICAgICAgYW5zLnU9dG1wLmw7CiAgICAgICAgICAgIGFucy5yPTIrdG1wLnUrdG1wLmQ7CiAgICAgICAgICAgIGFucy5sPTA7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGFucy5kPXRtcC5sOwogICAgICAgICAgICBhbnMudT10bXAucjsKICAgICAgICAgICAgYW5zLmw9Myt0bXAudSt0bXAuZDsKICAgICAgICAgICAgYW5zLnI9MDsKICAgICAgICB9CiAgICB9CiAgICBpZihtYXRjaFtsXSE9cikKICAgICAgICBhbnM9YW5zK3dvcmsobWF0Y2hbbF0rMSxyKTsKICAgIGRkW3VdPWFuczsKICAgIHJldHVybiBhbnM7Cn0KCmludCB0b3A9MDsKdmVjdG9yPCBwYWlyPGludCxpbnQ+ID4gYW5zOwoKdm9pZCBwcmludChpbnQgeCxpbnQgeSkKewovLyAgICBjb3V0PDx4PDwiICI8PHk8PGVuZGw7Cn0KCnBhaXI8aW50LGludD4gc2hvdyhpbnQgbCxpbnQgcixpbnQgeCxpbnQgeSxpbnQgZGlyKS8veCx554GP6L6o5qe45raT5amB56u05raT7oGE5Z+M5p2I5Ymn5q6R6ZCQPwp7CiAgICArK3RvcDsKICAgIGludCBkZWx0YT0oc3RyW2xdPT0nUCc/MzoxKTsKICAgIGludCBuZGlyPShkaXIrZGVsdGEpJTQ7CiAgICBpZihsKzE9PW1hdGNoW2xdKQogICAgewogICAgICAgIHgrPWR4W25kaXJdOwogICAgICAgIHkrPWR5W25kaXJdOwogICAgICAgIGFucy5wYihtcCh4LHkpKTsKICAgICAgICBwcmludCh4LHkpOwogICAgICAgIHgrPWR4W2Rpcl07CiAgICAgICAgeSs9ZHlbZGlyXTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBNYXRyaXggbng9ZGRbdG9wKzFdOwogICAgICAgIGludCBMZW49bnguZCsxOwogICAgICAgIGludCBvbGR4PXg7CiAgICAgICAgaW50IG9sZHk9eTsKICAgICAgICB4Kz1keFtuZGlyXSAqIExlbjsKICAgICAgICB5Kz1keVtuZGlyXSAqIExlbjsKCiAgICAgICAgYW5zLnBiKG1wKHgseSkpOwogICAgICAgIHByaW50KHgseSk7CgogICAgICAgIHNob3cobCsxLG1hdGNoW2xdLTEseCx5LG5kaXIpOwogICAgICAgIHg9YW5zW2Fucy5zaXplKCktMV0ueDsKICAgICAgICB5PWFuc1thbnMuc2l6ZSgpLTFdLnk7CiAgICAgICAgaWYoZHhbbmRpcl0pCiAgICAgICAgICAgIGFuc1thbnMuc2l6ZSgpLTFdLng9b2xkeCsobnguZCsyK254LnUpKmR4W25kaXJdOwogICAgICAgIGVsc2UKICAgICAgICAgICAgYW5zW2Fucy5zaXplKCktMV0ueT1vbGR5KyhueC5kKzIrbngudSkqZHlbbmRpcl07CiAgICAgICAgeD1hbnNbYW5zLnNpemUoKS0xXS54OwogICAgICAgIHk9YW5zW2Fucy5zaXplKCktMV0ueTsKCiAgICAgICAgaW50IHA9KHN0cltsXT09J0wnP254Lmw6bngucik7CiAgICAgICAgaWYoZHhbZGlyXSkKICAgICAgICAgICAgeD1vbGR4K3AqZHhbZGlyXTsKICAgICAgICBlbHNlIHk9b2xkeStwKmR5W2Rpcl07CiAgICB9CiAgICBpZihtYXRjaFtsXSsxPD1yKQogICAgewogICAgICAgIGludCBMZW49ZGRbdG9wKzFdLmQrMTsKICAgICAgICB4Kz1keFtkaXJdKkxlbjsKICAgICAgICB5Kz1keVtkaXJdKkxlbjsKICAgICAgICBhbnMucGIobXAoeCx5KSk7CiAgICAgICAgcHJpbnQoeCx5KTsKICAgICAgICBwYWlyPGludCxpbnQ+IHRtcD1zaG93KG1hdGNoW2xdKzEscix4LHksZGlyKTsKICAgICAgICB4PXRtcC54OwogICAgICAgIHk9dG1wLnk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgYW5zLnBiKG1wKHgseSkpOwogICAgICAgIHByaW50KHgseSk7CiAgICB9CiAgICByZXR1cm4gbXAoeCx5KTsKfQoKaW50IG1haW4oKQp7CiNpZm5kZWYgT05MSU5FX0pVREdFCi8vICAgIGZyZW9wZW4oImlucHV0LnR4dCIsInIiLHN0ZGluKTtmcmVvcGVuKCJvdXRwdXQudHh0IiwidyIsc3Rkb3V0KTsKI2VuZGlmCiAgICBpbnQgaTsKICAgIHNjYW5mKCIlcyIsc3RyKzEpOwogICAgbj1zdHJsZW4oc3RyKzEpOwogICAgaW50IGNjPTA7CiAgICBSRVAoaSwxLG4pCiAgICB7CiAgICAgICAgaWYoc3RyW2ldPT0nTCcpCiAgICAgICAgICAgICsrY2M7CiAgICAgICAgZWxzZSBjYy0tOwogICAgfQogICAgaWYoY2MhPTQpCiAgICB7CiAgICAgICAgcHJpbnRmKCJOSUVcbiIpOwogICAgICAgIHJldHVybiAwOwogICAgfQogICAgaW50IHJvdD0wOwogICAgaWYoc3RyWzFdPT0nUCcpCiAgICB7CiAgICAgICAgUkVQKGksMSxuKQogICAgICAgICAgICBpZihzdHJbaV09PSdMJykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcm90PWk7CiAgICAgICAgICAgICAgICByb3RhdGUoc3RyKzEsc3RyK2ksc3RyK24rMSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgfQogICAgUkVQKGksMSxuKQogICAgewogICAgICAgIHByZVtpXT1pLTE7CiAgICAgICAgc3VmW2ktMV09aTsKICAgIH0KICAgIHByZVswXT1uOwogICAgUkVQKGksMSxuLTEpCiAgICAgICAgaWYoc3RyW2ldIT1zdHJbaSsxXSkKICAgICAgICB7CiAgICAgICAgICAgIHF1ZVtlbmQrK109aTsKICAgICAgICAgICAgaGFzaFtpXT0xOwogICAgICAgIH0KICAgIHdoaWxlKGhlYWQ8ZW5kKQogICAgewogICAgICAgIGludCB1PXF1ZVtoZWFkKytdOwogICAgICAgIGlmKHN1Zlt1XSAmJiBzdHJbc3VmW3VdXSE9c3RyW3VdICYmIHByZVtzdWZbdV1dPT11ICYmIHU+MSkKICAgICAgICB7CiAgICAgICAgICAgIG1hdGNoW3VdPXN1Zlt1XTsKICAgICAgICAgICAgbWF0Y2hbc3VmW3VdXT11OwogICAgICAgICAgICBkZWwodSk7CiAgICAgICAgICAgIGRlbChzdWZbdV0pOwogICAgICAgICAgICBxdWVbZW5kKytdPXByZVt1XTsKICAgICAgICB9CiAgICB9CiAgICBjb25zdCBpbnQgTGVuPTEwMDAwMDAwMDA7Ci8vICAgIGNvbnN0IGludCBMZW49MTA7CiAgICBpbnQgeD0wLHk9MCxjbnQ9MDsKICAgIGFucy5wYihtcCh4LHkpKTsKICAgIHByaW50KHgseSk7CiAgICBmb3IoaT1zdWZbMF07aTtpPXN1ZltpXSkKICAgIHsKICAgICAgICBpbnQgcj1zdWZbaV0/KHN1ZltpXS0xKTpuOwogICAgICAgIGludCBsPUxlbi8yOwogICAgICAgIHgrPWR4W2NudF0qIGw7CiAgICAgICAgeSs9ZHlbY250XSogbDsKICAgICAgICBpZihpKzE8PXIpCiAgICAgICAgewogICAgICAgICAgICBhbnMucGIobXAoeCx5KSk7CiAgICAgICAgICAgIHRvdD0wOwogICAgICAgICAgICB3b3JrKGkrMSxyKTsKICAgICAgICAgICAgdG9wPTA7CiAgICAgICAgICAgIHNob3coaSsxLHIseCx5LGNudCk7CiAgICAgICAgICAgIGlmKGR4W2NudF0pCiAgICAgICAgICAgICAgICBhbnNbYW5zLnNpemUoKS0xXS54Kz1keFtjbnRdKmw7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGFuc1thbnMuc2l6ZSgpLTFdLnkrPWR5W2NudF0qbDsKICAgICAgICAgICAgeD1hbnNbYW5zLnNpemUoKS0xXS54OwogICAgICAgICAgICB5PWFuc1thbnMuc2l6ZSgpLTFdLnk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHgrPWR4W2NudF0qbDsKICAgICAgICAgICAgeSs9ZHlbY250XSpsOwogICAgICAgICAgICBhbnMucGIobXAoeCx5KSk7CiAgICAgICAgfQogICAgICAgIGNudCsrOwogICAgfQogICAgYW5zWzBdLnk9YW5zW2Fucy5zaXplKCktMV0ueTsKCiAgICBtYXA8aW50LGludD4gdHgsdHk7CiAgICBSRVAoaSwwLChpbnQpYW5zLnNpemUoKS0yKQogICAgewogICAgICAgIHR4W2Fuc1tpXS54XT1hbnNbaV0ueDsKICAgICAgICB0eVthbnNbaV0ueV09YW5zW2ldLnk7CiAgICB9CiAgICBpbnQgZD0wOwogICAgZm9yKG1hcDxpbnQsaW50Pjo6aXRlcmF0b3IgaXQ9dHguYmVnaW4oKTtpdCE9dHguZW5kKCk7KytpdCkKICAgICAgICBpdC0+eT1kKys7CiAgICBkPTA7CiAgICBmb3IobWFwPGludCxpbnQ+OjppdGVyYXRvciBpdD10eS5iZWdpbigpO2l0IT10eS5lbmQoKTsrK2l0KQogICAgICAgIGl0LT55PWQrKzsKICAgIGlmKHJvdCkKICAgICAgICByb3RhdGUoYW5zLmJlZ2luKCksYW5zLmJlZ2luKCkrbi1yb3QsYW5zLmJlZ2luKCkrbik7CiAgICBSRVAoaSwwLChpbnQpYW5zLnNpemUoKS0yKQogICAgICAgIHByaW50ZigiJWQgJWRcbiIsdHlbIGFuc1tpXS55IF0sdHhbIGFuc1tpXS54IF0gKTsKICAgIHJldHVybiAwOwp9Cg==