Description
小D和小H是两位神仙。他们经常在一起玩神仙才会玩的一些游戏,比如“口算一个4位数是不是完全平方数”。
今天他们发现了一种新的游戏:首先称s长度为len的前缀成为border当且仅当 s[1…len]=s[|s|-len+1…|s|]。
给出一个由01?组成的字符串s,将s中的问号用变成01替换,对每个len口算是否存在替换问号的方案使得s长度为len的前缀成为border,
把这个结果记做f(len)∈{0,1}。f(len)=1如果s长度为len的前缀能够成为border,否则f(len)=0
由于小D和小H是神仙,所以他们计算的s的长度很长,因此把计算的结果一一比对会花费很长的时间。为了方便比对,他们规定了一个校验值:
(f(1)*12)xor(f(2)*22)xor(f(3)*32)xor…xor(f(n)*n2)
来校验他们的答案是否相同。xor表示按位异或。
但是不巧,在某一次游戏中,他们口算出的校验值并不一样,他们希望你帮助他们来计算一个正确的校验值。 当然,他们不强迫你口算,可以编程解决。
Input
一个串s,保证每个字符都是0,1,或者? ∣s∣<=5*10^5
Output
输出字符串的校验值,即(f(1)*12)xor(f(2)*22)xor(f(3)*32)xor…xor(f(n)*n2)
Sample Input
1?0?
Sample Output
17
HINT
将问号填充为1001,则这个串有长度为1的border,故f(1)=1
将问号填充为1010,则这个串有长度为4的border,故f(4)=1
对于f(2)和f(3),可以枚举填充的字符是什么来证明他们的值是0。
故答案是1^2 xor 4^2=17
题解
法法塔是看出来了…
就是有些限制想不到怎么解决…
先给多项式
∑k=1len∑i=1len−k+1ti∗tlen−i+1∗(ai−alen−i+1)2\sum_{k=1}^{len}\sum_{i=1}^{len-k+1}t_i*t_{len-i+1}*(a_i-a_{len-i+1})^2k=1∑leni=1∑len−k+1ti∗tlen−i+1∗(ai−alen−i+1)2
显然把a数组倒置做FFT可以把上式优化成nlognn\log nnlogn
拆一下就是这样
titjAi2+titjBj2−2∗AitiBjtjt_it_jA_i^2+t_it_jB_j^2-2*A_it_iB_jt_jtitjAi2+titjBj2−2∗AitiBjtj
我算了三次fft…其实两次就够了…
懒得优化
然而这样会出现一种情况
两个在同一位置的括号匹配到了不一样的字符(简称无解了…)
怎么办!!
先知道一个事情 我们做完fft后是可以知道任意两个前缀后缀之间是否匹配的
设一个长度为i的前缀 对应后缀的位置是len-i+1
开头相距设为dis
每次往后跳dis 查找对应的后缀与之是否匹配即可
根据调和级数
复杂度是nlognn\log nnlogn
/*
: .
:
i
i .
i
: .
i .
i .
i
: .
i . i i : . . . . . . . .. . . .
. . . . . . . . .
: qQ . v2d . i: ..:ij.iBE .i EBj .irrivri.::iiiir7r. . SPd. :
i UQB .BBBBE BBBQBBBBLiBB.1BBi :X: BBu . .KBBBBBBBBBBBBBBBQv :BBBBB
. iBY PD. BBY vBBv. ..:gB1 rBM 7B1 RQP MBgvPPQBB uRq. .. . jBBQ.BBBr
:.BBrQBBBBBL iQBB7:777gBSYvrKBBv:v71r..YPBBBBBBBBBBEBBB 7RBZQdBBBdEgBQE 1QBB1 QBBB:
.:BBBBJ.qBBDBBBBBBBvrQBQBBBBBBBBBBBBBgg5UBBBBriiBQ1 rBB .:.:i. :KQBi ..:: :.. . . . ..... UBBB5 UJ: rBBBBXi
. IQY i:.:.. YBs :BB IE. XBZ QBs 7BB rBBBBQBBBBBBBQBBBBq BQBBBBBBBBBBBBBBBBviBBE. .BBZ .BBgi.
. BBBQSJ.Kb5BQgRBPv :5gQBBBQBB:YBvrBBd QBE BBdiBBBB5 .BB uBs iririiiriir7iii77i. ii .BBD .
. uQ5Sv .BB::i::QBU BBQMBK. 7BBBP. DBq QB1 DQ7.L. sBBdQBBMBBBQBBBBBQDi BB5
. ...:BB KBJ uB1 UBBBL QBL RQb i:. BBPvi.UBBuY7v7iQBqrrur. BBE .
:LBBBBBBJQBBBBQBBBJ :rvBBu:BBB1jBBPbBB SBBZIvSUguJXRBBB: 7QBB BBu .. BBQ
r.XX... .QBIYXDJBB1 qBBBBi ir rMQBQ. .sPBBBBBBBBRBBD7 XBBi dB1. . .. .BBg
i . . . . . .. ... .
:
i . .
i
i .
i :r:.
i . . vKKSj. .
r .. :B: js .
i . . rK .S: :::
r :v LS . ibi7gv .
i :Ligi .QJ :g7 .
. ...5d: . i2Sd rb. vj: .
. .7:r27DBi . .Bb: . 7K..Ps
uij1Pdr. ri . Sq :Kj7Ii . . :v:
UvY: 7P. . . .7 .vIqX. .. . .dBRS7.
. . qP . . . .. . . .. :r. .qi :2ZPi
. . gs . .:K2 . .irvIs75K5XEKMKgZsD522YLri. iBB1i Pr .2r
i iS: .isjjQ. .:rs5KPPMBBBZdBBgi:7Rd7XBBBRSMBBDZQZSr. rDYiiYdQSr. dY
: Ys .iXbi. 7: 7v5gQZqPEKXUIjUIdbr ur jRQr1E: .rJgBBDL: iEv .sdD5Yi. MX . .
i Si .vU57i .ibQBBgMPI175XUvsq5LBj :Li. jQLJ: . .rdBBQsYL :r1ISv: .gu .
: .. iU r5Qu. :sBBD7qDqbbijPj5ISXv22UK .BY . .gSP: .q: rBBBBS . . .7KEYi. qv .
. qBsY1i :IqBZqI2rUXLXQPrYjIuED2jZPv. KI . . .BR. rd .bBUBQu. . .isZK1: 5s
: vPv. .idDBEP1XYKXQR1r5d2SdPqEDv7IEY Yv . KB.:U. :Ui .BJUBBB1 . rXqIrrB2 .
v rQDM1dj7SM1qIuPgXJKS2sKU5urLDMr :Bi . .dBMi7BPYJ 1PKL: BjKIUPBB1 . . :irMX
i . .vKDDr1YREIPgv1qS1Qbju1IS2US5vUZBu sr . :BBBBdXMDMgjv. : guJsP7rQgU: JdrsSv:
7 rQREJ5u2vuKv5dXKKPXqqXK1PSSqP2USqqBDj . 7QBQRPQriQg:..v7i:. MqEXBs72DQB: .iYYr..iPRJ
7 . .MRB221QqKrYSSXdXXuBZuSguL1sPMDQQDPPgBi . :RBBMB5 PELBBBj vP. irRBgRPEv .Ju7ivv7vLi. .
: 7DQUdSPqgIqUsKSYv5Si2PrruJSBZR5r:: :Z: .irvX::qPPZMBBQgs .Xs LPuXBBi :Dd2rLsr. .
i YBZ7Lg2bUPLb172Xr7PQvJuuuMBbX7. .uRu. :QEBQRRBZgggQBSrY. :SQQX :27:. .
i .EP2PX1qJYIPuu5I2g2uB5YXbDZPJ .rr. . 7gZU7r7vYvvvJqBQRBMdgDMgBQQr r5BBr
.gB2LgEsPPuKE2IrM5Iu1U2JXgS. :7vvvsYLL7. .rs77JJr. JBQDBbdEZBRgBP . .YIUvirvBQ: .
XQQSqgDJ7qg5bPXqLd1bQ2JQB2. ..:7Lv7: iBQSREEBQQRBP: iSPL7. rBu
QgUjEE2qJbKsjX2duqYKr5BS. .. .rYr. dBQBZBQBKgM. . rZ2: jEi
vJdPIJI5UPSYKb5uLbLSDEu . :BBgBPEBr . .... . iBK.
YvLb7K5L7ubsjgJuuSsPQ7 .....:iiirr77v7vrv1PXU77rr::. :E. . .. .. sgi
LuKQrsSd5XQPqSij7bBu :ivu5J7i::::::::::i::.::iri.. :Ei. ..i715qLPdUqS. iBi .
7UPBv2IPqP1IdXLZZPr . . .sY .ir:. .. .QE ..
UsJRubSv7ggUJr1Qg: .. r5 vd.
d5YPrSqX7QIvPRBX. . . ..:i777r7vJvr: . .rZ . .iE5rr
2LKXj2E17DjSMSQi ..ii7uqS522J7:..... .. 7Z. . .75Y::. 7KdBZEXXBQ:
r7PQqdEjJEPJuZJ iIPK1j7:.:. .:i:...... :P .iLuvPSsXQbr .JBP
sLPP1uqs2XR7JQ: .:i. .:71ZBBBQEDDMbdMBBBdui: rZ. . bB.
UUqK7vSIv5PuDg .YdQBBBBQBMESJ777s1bPdEgRQBBRUi. .5 . .gq
vLZPvvbKLdSIBv . 1MBRQBBBMEbZPvgBRJrLY7Uj2J7rvPDQBBgUY722 ... .. iBJ
irIKvUPI7M1SRi . . 7BB1JUvSd1Y512IYSBMKLPv1XirsivvUKgDgBBBBBBKr:. .. uE.
D2KIJ5D17EPdd. . qBJv.ivivYi7JvrLrLEgbbP1PE:71sS5sDq7vDQD2qbgBBBMJi rR7
vJPbvJq2YgEQ2 .BP.L7ijIEuiivr7vii1PKgg5dRjXgUSujJ7JgJ7Piru1UKMBBQM2i .2I:.
vrXP1Xg2vJjbL . . sBBuXI1gBgE2SI7vIrrsIiSISdBSEZ1bggQv7Es:U77YLirugggDBBBgKUJrri:.:7IEP.
XU1UubPuLu7LY . :5RBgUBBPPdggBEUdqIKXviuJrYdPPq2PKKBqY1jrj75I1LL7UXZBBdPEQBP7jIIdKSBB. .
sIDbX5X5KRBSE .ZXLXI7q57UJ5IRUUZP5KZguivSv1S55bS12BMBjJ7dXBgZIqr7dqMEPBEQQ: KB7 ... ..
PU7v5MPJ7KZPD iBbU7v77:r7irYdIud5KqZPsrs2vYUsJuPP5SLKgQdEEgdPgMX7qvI5DXbMX :BQ
511sSdZXI51vg. . LgXgU77iir5dddBMMBBBP5dP52S2gBQ2vL22RdBQBPQP15SdMR1Jivrr:MBr SBv .jDBMbuv: ..
vU52sujjUEq1E. . . 2MrBDU5PQBZP7.:..irDQQPdBBRqi. .:jXQMBPrIjXXBP1iuii.BE .BX rSQK:...i1dX7.
KJ1svuqsrEgPK . v1rDQDBj:. .LQBS. .JBE.r7555RbbK55PBr . Kg 7QM. 7BBv
PXdEu5PsLKv5di 7E1dKi :J. :gg1iq1LsQRRYuBP .r KQi iBg .2Q5. .
IjPP1ID5UJYdBY rBBS . . :BErj7YU5ZPdBZ vBv :Rd IBi
2UKK7JPXuIgQBb . bBi . . . . EBPYv7srIKBB vBr sBi . .B1
vvbb15d5bSPLPB: . rB: .. . :qBKQvYLJRK iQ2 :ZBBr . Rv .
SY57vDIKZLuuKBi .BB. . . . bBXgudD5v .2BBgqqbgBJ . ... .E5
v75vYqPPq5KPjJE: . iBBr . .BMvBQEv: BBq1EsSQS5Bi . . :BL
vUUs7YuJrXJd7:BP . .PQqv: .. .:77juBQJsi rBQYiJU1JX5PRb: vBL .
dZsY55RS1qjdqrBBL .JPMRP77. .:.....:.:i7vjuSqEEbXqqquL7. . .jBQJvdR5vuuuJ5BBq: isBB . .
BQ7v1KDu5qYSqsJgQ: .r7IEPUs11uj25X21JJri::... 7QB1rPQY2duIQKXZJ7BBdu7:isDZ5: ..
LYRgsvSUPqX1UUI2Bd. ii2MEgI7dRSJ1sSBX7SPXsPZBBXr77.
vBB1PBZMQggZDZMXgBBDgMRbbEQQRZPZRPKSPbDRBDKujsuYv25Ys2qSEPDMMddZgZMQBBBgQBQEPsqXJSqsIP52M5UPPsvERZi
s5QgPQBIDMMDgDgDgBBgEBBBBBBQQBBBBQBBBBBQQBBBBBBBBQBBBBBQBBBBBBBBBQBBBBBBBMBQgESDDSEKUPgU2qSqUrPBBv. .
rrPBBgMDMQRRMQgQDMQBQBMgRQggDgRBBBgZgBBBQBBBBBBBBBBBBBS: ..vbBBBQBQMbSQQMEYSuLI5uPKv1D77PBBXi ...
i LdMdKKqqPgZSgd1PZPSLXPXSZZXPZIQZJ5EKdDgMMdqYr.::.:bB: LBXIQBKPgBquP2PZuUuUSXj5ZqXBB7
i:BP2j:vYs7q5sZI:2uvv7Ss7UYKs51r51rJLjDg7: .BvPPgX1vrii:2Qi vBbIMQuZrsDP55uu2XYdBQU: .
rPBLJ27PXu7SP2QIvSJsPKgYPPisXq1Lg51ZBdr 2Q: .. .qBU.:vbv. :IQBqiSs2KYLudKv7QQb.
BBXr7P1PXXsPSjD5757YPPE1JJiXPZj7sSQK: 1v iBu g7 . iDBPQsIPuIP7vZB1. .
MuiK7uKKj11Pj:S1UbuJXv2JJSKKLU2rSgX .....:::...::.: .Bd..i.:bj .SB7 .:: KBgMv1gu2KqDBZ: .:ii:ri::iiirrrviii7i. */
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#define MAXN 500005
#define LL long long
using namespace std;
const double PI=acos(-1.0);
struct Complex
{
double r,i;
Complex(){}
Complex(double _r,double _i){r=_r;i=_i;}
friend Complex operator +(Complex u,Complex v){return Complex(u.r+v.r,u.i+v.i);}
friend Complex operator -(Complex u,Complex v){return Complex(u.r-v.r,u.i-v.i);}
friend Complex operator *(Complex u,Complex v){return Complex(u.r*v.r-u.i*v.i,u.r*v.i+u.i*v.r);}
}A[MAXN*4],B[MAXN*4];
int R[MAXN*4],L,ln;
void fft(Complex *y,int len,int on)
{
for(int i=0;i<len;i++)if(i<R[i])swap(y[i],y[R[i]]);
for(int i=1;i<len;i<<=1)
{
Complex wn(cos(PI/i),sin(on*PI/i));
for(int j=0;j<len;j+=(i<<1))
{
Complex w(1,0);
for(int k=0;k<i;k++)
{
Complex u=y[j+k];
Complex v=y[j+k+i]*w;
y[j+k]=u+v;
y[j+k+i]=u-v;
w=w*wn;
}
}
}
if(on==-1)for(int i=0;i<len;i++)y[i].r/=(double)len;
}
int cal[MAXN*2];
int c1[MAXN*4],c2[MAXN*4],c3[MAXN*4],s1[MAXN*4],s2[MAXN*4];
char ch[500005];
bool ok[500005];
int main()
{
// freopen("a.in","r",stdin);
scanf("%s",ch+1);int len=strlen(ch+1);
for(int i=1;i<=len;i++)cal[i]=ch[i]=='?'?0:ch[i]-'0'+1;
for(int i=0;i<len;i++)A[i]=Complex((double)cal[i+1]*cal[i+1],0);
for(int i=0;i<len;i++)B[i]=A[len-i-1];
L=0;
for(ln=1;ln<=len*2;ln<<=1)L++;
for(int i=0;i<ln;i++)R[i]=(R[i>>1]>>1)|(i&1)<<(L-1);
fft(A,ln,1);fft(B,ln,1);
for(int i=0;i<ln;i++)A[i]=A[i]*B[i];
fft(A,ln,-1);
for(int i=0;i<ln;i++)c1[i]=(A[i].r+0.5),A[i]=B[i]=Complex(0,0);
for(int i=0;i<len;i++)A[i]=Complex(ch[i+1]=='?'?0:cal[i+1]*cal[i+1]*cal[i+1],0);
for(int i=0;i<len;i++)B[i]=Complex(cal[len-i],0);
fft(A,ln,1);fft(B,ln,1);
for(int i=0;i<ln;i++)A[i]=A[i]*B[i];
fft(A,ln,-1);
for(int i=0;i<ln;i++)c2[i]=(A[i].r+0.5),A[i]=B[i]=Complex(0,0);
for(int i=0;i<len;i++)A[i]=Complex(ch[i+1]=='?'?0:cal[i+1],0);
for(int i=0;i<len;i++)B[i]=Complex(cal[len-i]*cal[len-i]*cal[len-i],0);
fft(A,ln,1);fft(B,ln,1);
for(int i=0;i<ln;i++)A[i]=A[i]*B[i];
fft(A,ln,-1);
for(int i=0;i<ln;i++)c3[i]=(A[i].r+0.5);
//init
memset(ok,false,sizeof(ok));
for(int i=0;i<len;i++)
{
int sum=c2[i]+c3[i]-2*c1[i];
if(!sum)ok[i+1]=true;
}
LL ans=0;
for(int i=1;i<=len/2;i++)if(ok[i])ans=ans^(LL)i*i;
for(int i=len/2+1;i<=len;i++)
if(ok[i])
{
bool vis=true;
if(i==len){ans=ans^(LL)i*i;continue;}
int dis=len-i;//判断相距
for(int j=i;j>0;j-=dis)if(!ok[j]){vis=false;break;}
if(vis)ans=ans^(LL)i*i;
}
printf("%lld\n",ans);
return 0;
}
/*
10??10
48
*/