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表示按位异或。

但是不巧,在某一次游戏中,他们口算出的校验值并不一样,他们希望你帮助他们来计算一个正确的校验值。

当然,他们不强迫你口算,可以编程解决。

Solution

首先假设 \(border=len\) , 那么相当于是把串 \(s[1...len]\) 向右平移 \(n-len\) , 然后这个串和平移后的相等.

也就是说存在一个长度为 \(x\) 的循环节 , 那么就存在 \(border=n-x\) , 所以判断是否存在循环节就行了.

对于一对 \(i,j\) , \(s[i]!=s[j]!='?'\) , 那么就不存在长度为 \(|i-j|\) 的循环节 , 自然也不存在 \(|i-j|\) 约数的循环节.

所以我们把不合法的判掉 , 剩下的就是循环节了 , 距离为 \(i-j\) 的所有字符对一起考虑 , 只需要把 \(j\) 变成 \(n-j\) 做一边 \(FFT\) ,通过位置 \(i-j+n\) 就可以判断是否存在长度为 \(i-j\) 的循环节了.

#include<bits/stdc++.h>
using namespace std;
template<class T>void gi(T &x){
int f;char c;
for(f=1,c=getchar();c<'0'||c>'9';c=getchar())if(c=='-')f=-1;
for(x=0;c<='9'&&c>='0';c=getchar())x=x*10+(c&15);x*=f;
}
typedef complex<double> dob;
const int N=2e6+10;const double pi=acos(-1.0);
int n,m,R[N],L=0,d[N];char s[N];
inline void FFT(dob *A,int o){
for(int i=0;i<n;i++)if(i<R[i])swap(A[i],A[R[i]]);
for(int i=1;i<n;i<<=1){
dob wn(cos(pi/i),sin(pi*o/i)),x,y;
for(int j=0;j<n;j+=i<<1){
dob w(1,0);
for(int k=0;k<i;k++,w=w*wn){
x=A[j+k],y=w*A[j+k+i];
A[j+k]=x+y,A[j+k+i]=x-y;
}
}
}
}
dob A[N],B[N];
int main(){
freopen("pp.in","r",stdin);
freopen("pp.out","w",stdout);
scanf("%s",s+1),m=strlen(s+1);
for(n=1;n<=(m<<1);n<<=1)L++;
for(int i=0;i<n;i++)R[i]=(R[i>>1]>>1)|((i&1)<<(L-1));
for(int i=1;i<=m;i++)A[m-i]=(s[i]=='1'),B[i]=(s[i]=='0');
FFT(A,1),FFT(B,1);
for(int i=0;i<=n;i++)A[i]*=B[i];
FFT(A,-1);
for(int i=m+1;i<n;i++)d[i-m]=(int)(A[i].real()/n+0.5)|(int)(A[2*m-i].real()/n+0.5);
for(int i=m;i>=1;i--)
if(!d[i])for(int j=i;j<=m;j+=i)if(d[j]){d[i]=1;break;}
long long ans=0;
for(int i=1;i<=m;i++)if(!d[m-i])ans^=1ll*i*i;
cout<<ans;
return 0;
}

bzoj 5372: [Pkusc2018]神仙的游戏的更多相关文章

  1. BZOJ5372: [Pkusc2018]神仙的游戏

    BZOJ5372: [Pkusc2018]神仙的游戏 https://lydsy.com/JudgeOnline/problem.php?id=5372 分析: 如果\(len\)为\(border\ ...

  2. BZOJ5372: PKUSC2018神仙的游戏

    传送门 Sol 自己还是太 \(naive\) 了,上来就构造多项式和通配符直接匹配,然后遇到 \(border\) 相交的时候就 \(gg\) 了 神仙的游戏蒟蒻还是玩不来 一个小小的性质: 存在长 ...

  3. BZOJ5372 PKUSC2018神仙的游戏(NTT)

    首先有一个想法,翻转串后直接卷积看有没有0匹配上1.但这是必要而不充分的因为在原串和翻转串中?不能同时取两个值. 先有一些结论: 如果s中长度为len的前缀是border,那么其存在|s|-len的循 ...

  4. LOJ6436 [PKUSC2018] 神仙的游戏 【FFT】

    题目分析: 题目要求前后缀相同,把串反过来之后是一个很明显的卷积的形式.这样我们可以完成初步判断(即可以知道哪些必然不行). 然后考虑一下虽然卷积结果成立,但是存在问号冲突的情况. 箭头之间应当不存在 ...

  5. loj 6436 PKUSC2018 神仙的游戏

    传送门 好妙蛙 即串\(s\)长度为\(n\)首先考虑如果一个长度为\(len\)的\(border\)存在,当且仅当对所有\(i\in[1,len],s[i]=s[n-len+i]\),也就是所有模 ...

  6. [LOJ6436][PKUSC2018]神仙的游戏

    loj description 给你一个只有01和?的字符串,问你是否存在一种把?改成01的方案使串存在一个长度为\(1-n\)的\(border\).\(n\le5\times10^5\) sol ...

  7. [PKUSC2018]神仙的游戏(FFT)

    给定一个01?串,对所有len询问是否存在一种填法使存在长度为len的border. 首先有个套路的性质:对于一个长度为len的border,这个字符串一定有长度为n-len的循环节(最后可以不完整) ...

  8. [PKUSC2018]神仙的游戏

    题目 画一画就会发现一些奇诡的性质 首先如果\(len\)为一个\(\operatorname{border}\),那么必然对于\(\forall i\in [1,len]\),都会有\(s_i=s_ ...

  9. LOJ #6436. 「PKUSC2018」神仙的游戏(字符串+NTT)

    题面 LOJ #6436. 「PKUSC2018」神仙的游戏 题解 参考 yyb 的口中的长郡最强选手 租酥雨大佬的博客 ... 一开始以为 通配符匹配 就是类似于 BZOJ 4259: 残缺的字符串 ...

随机推荐

  1. django fileup-load

    文件上传 使用form表单类的上传 forms.py from django import forms class UploadFileForm(forms.Form): title = forms. ...

  2. DI 依赖注入之StructureMap框架

    DI  依赖注入之StructureMap框架 一.简叙: structureMap只是DI框架中的其中之一. 二.安装及使用: 1.懒人方法: 使用MVC5项目时,可以直接在nuget程序包中安装S ...

  3. linux 安全配置随笔

    1. 禁止Ctrl+Alt+Del直接重启服务器 /bin/mv /etc/init/control-alt-delete.conf /etc/init/control-alt-delete.conf ...

  4. [转] HTTP状态码错误代码

    一些常见的状态码为: 200 - 服务器成功返回网页 404 - 请求的网页不存在 503 - 服务不可用 详细分解: 1xx(临时响应) 表示临时响应并需要请求者继续执行操作的状态代码. 代码 说明 ...

  5. iOS 轻松使用 App 数据统计

    想获取用户各项行为数据吗? 想轻松查看用户行为图表吗? 想高效进行 App 运营管理吗? 想,来我带你玩转 App 数据统计.这里我使用专业.轻便的 JAnalytics. 本文内容分为两部分:代码示 ...

  6. 基于Java软引用机制最大使用JVM堆内存并杜绝OutOfMemory

    题记:说好的坚持一周两篇文章在无数琐事和自己的懒惰下没有做好,在此表达一下对自己的不满并对有严格执行力的人深表敬意!!!! -------------------------------------- ...

  7. python中package机制的两种实现方式

    当执行import module时,解释器会根据下面的搜索路径,搜索module1.py文件. 1) 当前工作目录 2) PYTHONPATH中的目录 3) Python安装目录 (/usr/loca ...

  8. 网络传输层之TCP/UDP详解

    一.运输层协议概述 从通信和信息处理的角度看,运输层向它上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也是用户功能中的最低层. 运输层的任务就是负责主机中两个进程之间的通信,其数据传输的单 ...

  9. 3、TensorFlow基础(一) 设计思想与编程模型

    1.TensorFlow系统架构 如图为TensorFlow的系统架构图: TensorFlow的系统架构图,自底向上分为设备层和网络层.数据操作层.图计算层.API层.应用层,其中设备层和网络层,数 ...

  10. java集合线程安全测试

    package com.cxy; import java.util.HashMap; import java.util.Hashtable; import java.util.Map; import ...