👤

Problema #861 Dublare de pe Pbinfo

Cerința
Fie un șir de caractere. Prin dublarea șirului înțelege oglindirea sa și concatenarea oglinditului la șirul inițial. De exemplu, prin dublarea șirului arc se obține șirul arccra. Orice șir de caractere se poate obține prin dublarea de un număr de ori (eventual de zero ori) a unui șir de caractere.

Se dă un șir de caractere s. Să se determine numărul maxim de operații de dublare care pot fi aplicate succesiv pentru a obține șirul s.

Date de intrare
Programul citește de la tastatură șirul s, format din litere mici ale alfabetului englez.

Date de ieșire
Programul va afișa pe ecran numărul M, reprezentând numărul maxim de operații de dublare prin care se poate obține s.

Restricții și precizări
șirul s va avea cel mult 255 caractere

Iau numai 60 de puncte ,stie cineva de ce?(Primesc raspuns gresit)


Asta e codul:

#include
#include

using namespace std;

int main()
{
char s[258];

cin >> (s + 1);

int n = strlen(s) - 1, cnt = 0, cn;

cn = strlen(s) - 1;

while(n % 2 == 0)
{
cnt++;
n = n / 2;
}

int st = 1, dr = cn, k = 0;
cn = cn / 2;

for(int i = 0; i <= cnt - 1; ++i)
{
int nebunie = cn;
while(nebunie)
{
if(s[st] != s[dr])
{
if(k != 0)
cout << k + 1;
else
cout << k;
return 0;
}
st++;
dr--;
nebunie--;
}
k++;
cn = cn / 2;
dr = cn;
st = 1;
}
cout << k - 1;

return 0;
}


Răspuns :

#include <iostream>

#include <cstring>

using namespace std;

int main()

{

   char sir[256];

   cin.getline(sir,256);

   int n=strlen(sir), m=0, ok=1, i;

   while (n%2==0 && ok)

   {

       for (i=0; i<n/2; ++i)

       {

           if (sir[i]!=sir[n-1-i]) { ok=0;  break; }

       }

       if (ok) { ++m; n/=2; }

   }

   cout <<m;

   return 0;

}