我无法理解这段代码,请向我解释for循环的第二行发生了什么。
#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;
}
答案 0 :(得分:1)
使用ASCII
来检查[0,i]间隔中的字符串是否为回文序列
例如,如果字符串是 a2a
---------------------------
i = 0
---------------------------
a = a * M + str [0] = 97
b + = str [0] * p = 97
p * = M - > p = 3
由于a == b然后h [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
因为!= 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
答案 1 :(得分:0)
这行代码:
a=a*M+s[i],b+=s[i]*p,p*=M;
正在使用“逗号运算符”。逗号运算符计算左侧,抛出结果,然后计算右侧并返回结果。
在此代码中,它与分号具有完全相同的效果。显然,这段代码的作者认为有一些理由更喜欢这里的逗号运算符而不是使用分号 - 我不同意,但这只是我的看法。