#include <iostream>
#include <ctype.h>
#include <string.h>

char *OdwrocNapis(char *Bufor,int dlugosc=0)
  {
   if(dlugosc<=0) dlugosc=strlen(Bufor);
   char *p=Bufor;
   char *k=Bufor+dlugosc-1;
   while(p<k)
     {
      char c=*p; *(p++)=*k; *(k--)=c;
     }
   return(Bufor);
  }

char *OdwrocSlowa(char *Bufor)
  {
   char *p=Bufor;
   char *k=Bufor+strlen(Bufor);
   while(p<k)
     {
      char *ps=p;
      while((*ps)&&(*ps==' ')) ++ps;
      char *ks=ps;
      while((*ks)&&(*ks!=' ')) ++ks;
      if(ps<ks) OdwrocNapis(ps,ks-ps);
      p=ks;
     }
   OdwrocNapis(Bufor);
   return(Bufor);
  }

//const char LiteryPolskie[]="¹æê³ñóœ¿Ÿ\0¥ÆÊ£ÑÓŒ¯"; // Windows (aby zrozumiec co tu jest zapisane)
//const char LiteryPolskie[]="¥†©ˆä¢˜¾«\0¤¨ãà—½"; // Windows console
const char LiteryPolskie[]="±æê³ñó¶¿¼\0¡ÆÊ£ÑÓ¦¯¬"; // Linux

char DuzaLitera(char Zn)
  {
   const char *Ptr=strchr(LiteryPolskie,Zn);
   if(Ptr) Zn=*(Ptr+10);
   else Zn=(char)toupper(Zn);
   return(Zn);
  }

bool CzyPalindrom(const char *Bufor)
  {
   const char *p=Bufor;
   const char *k=Bufor+strlen(Bufor)-1;
   while(p<k)
     {
      while((p<k)&&(*p==' ')) ++p;
      while((p<k)&&(*k==' ')) --k;
      if((p<k)&&(DuzaLitera(*p)!=DuzaLitera(*k))) return(false);
      ++p; --k;
     }
  return(true);
 }

int main()
  {
   while(true)
     {
      char Bufor[1024];
      cout<<"Podaj napis: ";
      cin.getline(Bufor,1024,'\n');
      if(!*Bufor) break;
      cout<<Bufor<<endl;
      int dl=strlen(Bufor);
      cout<<"Odwrocony wydruk: ";
      for(int i=dl-1;i>=0;--i) cout<<Bufor[i];
      cout<<endl;
      cout<<"Napis "<<(CzyPalindrom(Bufor)?"":"nie ")<<"jest palindromem"<<endl;
      char Bufor2[1024];
      strcpy(Bufor2,Bufor);
      cout<<"Odwrocony napis: ";
      cout<<OdwrocNapis(Bufor2)<<endl;
      char Bufor3[1024];
      strcpy(Bufor3,Bufor);
      cout<<"Odwrocone slowa: ";
      cout<<OdwrocSlowa(Bufor3)<<endl;
     }
   return(0);
  }
