2015-03-14 6 views
0

Я не могу понять этот код, пожалуйста, объясните мне, что происходит во второй строке цикла for.Не могу понять сокращенный код в palindrome

#include <cstdio> 
char s[5005000]; 
int h[5005000]; 
const int M=3; 
int main() { 
    scanf("%s",s); 
    int a=0,b=0,p=1,v=0; 
    for(int i=0;s[i];++i){ 
    a=a*M+s[i],b+=s[i]*p,p*=M; 
    if(a==b)v+=(h[i+1]=h[(i+1)>>1]+1); 
    } 
    printf("%d\n",v); 
    return 0; 
} 
+3

Отладка printf или шагающий шаг с любым разумным отладчиком, скорее всего, скажет так же, как любой ответ здесь. Вы тоже пробовали? – WhozCraig

+0

Возможно, это также поможет, если вы замените эти однобуквенные имена переменных более описательными именами при расшифровке алгоритма. 's', например, можно было бы переименовать в' input_string'. –

ответ

1

Он проверяет, является ли строка в [0, я] интервал палиндром или не используя ASCII
, например, если строка a2a
------------ ---------------
i = 0
---------------------------
а = а * М + ул [0] = 97
Ь + = ул [0] * р = 97
р * = М -> р = 3
Так как A == B затем ч [1] = h [1 >> 1] + 1 = 1 и v + = h [1 ], поэтому v = 1
---------------------------
i = 1
-------- -------------------
a = a * M + str [1] = 97 * 3 + 50 = 341
b + = str [1] * p = 97 + 50 * 3 = 247
p * = M -> p = 9
Поскольку a! = B, ничего не происходит
------------------- --------
i = 2
---------------------------
a = a * M + str [2] = 341 * 3 + 97 = 1120
b + = str [2] * p = 247 + 97 * 9 = 1120
p * = M -> p = 27
Поскольку a == b тогда h [3] = h [3 >> 1] + 1 = 2 и v + = h [3], поэтому v = 3
- -------------------------
Наконец, v = 3

0

Эта строка кода:

a=a*M+s[i],b+=s[i]*p,p*=M; 

использует «оператор запятой». Оператор запятой оценивает левую сторону, отбрасывает результат, затем оценивает правую сторону и возвращает результат.

В этом коде он имеет тот же эффект, что и точка с запятой. По-видимому, автор этого кода думает, что есть некоторая причина предпочесть запятую здесь вместо того, чтобы использовать точки с запятой - я не согласен, но это только мое мнение.

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