2016-02-02 15 views
-3

Я пытаюсь сделать эту проблему на hackerrank:
https://www.hackerrank.com/challenges/funny-string/copy-from/17051736
Размера входной строки, как предполагается, варьируется в пределах от 1 до 10000, но когда я представить этот код, он показывает ошибку сегментации в тестовых # 7,8 и 9.
Но когда я использую тип данных массива char вместо строкового типа данных при одинаковой логике, все тестовые примеры передаются без проблем.
Почему это происходит? Должен ли строка типа данных хранить 10 000 символов в порядке?Почему я получаю ошибку сегментации в этом коде?

#include<iostream> 
#include<cstring> 
#include<cmath> 
#include<string> 
using namespace std; 
int main() 
{ 
string S,R; 
int T,i,j,flag,size; 
cin>>T; 
cin.ignore(); 
while(T--) 
{ 
    cin>>S; 
    for(i=S.size()-1,j=0;i>=0;--i,++j) 
     R[j]=S[i]; 
    size=S.size(); 
    for(i=1,flag=1;i<size;++i) 
    { 
     if(abs(S[i]-S[i-1]) != abs(R[i]-R[i-1])) 
     { 
      flag=0; 
      break; 
     } 
    } 
    if(flag==1) 
     cout<<"Funny"<<endl; 
    else 
     cout<<"Not Funny"<<endl; 
} 
return 0; 
} 

ответ

3

В

for(i=S.size()-1,j=0;i>=0;--i,++j) 
    R[j]=S[i]; 

R[j] не действует для любого j поскольку R имеет нулевой размер.

Если вы хотите R быть противоположен S, то вы можете просто использовать

std::string R(S.rbegin(), s.rend()); 
//or 
R.assign(S.rbegin(), s.rend()); 
0

Так как я не могу комментировать, как новичку: Почему не индекс S с конца как быстрый способ получить R ? Сравнение S [i-1] - S [i] с S [n-i] - S [n-i-1] Поскольку n - длина. Просто нужно выяснить середину цикла, чтобы закончить, иначе вы закончите с двойным максимальным сравнением.

Смежные вопросы