loj

description

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

sol

这种题都不会我还是太菜了。

有一档部分分是“01的个数不超过\(5000\)”。这个其实对正解的提示是蛮大的。

有一个显然的结论:存在一个长度为\(len\)的\(border\)当且仅当对于\(\forall i\in[1,len]\) 有 \(s[i]=s[n-len+i]\)。(感谢热心网友找出这里的一个错误)

或者这样说,把所有位置在模\(n-len\)意义下分组,同一组里的01要全部相同。

那么,如果存在一组01他们的下标之差为\(x\),那么所有\(y|x\)的\(n-y\)都不可能成为\(border\)。

这样\(67\)分就可以写一个\(5000^2\)枚举01对统计,然后每次扫一遍倍数\(O(n\log n)\)计算答案。

考虑正解。现在的复杂度瓶颈在于枚举01对。

搞两个生成函数\(A(x)\)和\(B(x)\),\(A(x)=\sum_{i=0}^{n-1}[s_i==0]x^i\),\(B(x)=\sum_{i=0}^{n-1}[s_i==1]x^i\)。

我们知道,多项式卷积计算的是所有下标之和为一定值的乘积之和,也就是\(C_i=\sum_{j+k=i}A_jB_k\)。现在我们要统计的是差为定值的。

把一个多项式\(reverse\)过来不就好了么。形式化地,令\(A(x)=x^{n-1}A(\frac 1x)\),然后计算\(C(x)=A(x)B(x)\)得到的第\(i\)次项系数就是满足“1的下标减0的下标等于\(i-n\)”的01对数。

复杂度\(O(n\log n)\)。

code

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int gi(){
int x=0,w=1;char ch=getchar();
while ((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
if (ch=='-') w=0,ch=getchar();
while (ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
return w?x:-x;
}
const int N = 3e6+5;
const int mod = 998244353;
int n,len,a[N],b[N],rev[N],l,og[N];
char s[N];
int fastpow(int a,int b){
int res=1;
while (b) {if (b&1) res=1ll*res*a%mod;a=1ll*a*a%mod;b>>=1;}
return res;
}
void ntt(int *P,int opt){
for (int i=0;i<len;++i) if (i<rev[i]) swap(P[i],P[rev[i]]);
for (int i=1;i<len;i<<=1){
int W=fastpow(3,(mod-1)/(i<<1));
if (opt==-1) W=fastpow(W,mod-2);
og[0]=1;
for (int j=1;j<i;++j) og[j]=1ll*og[j-1]*W%mod;
for (int p=i<<1,j=0;j<len;j+=p)
for (int k=0;k<i;++k){
int x=P[j+k],y=1ll*og[k]*P[j+k+i]%mod;
P[j+k]=(x+y)%mod;P[j+k+i]=(x-y+mod)%mod;
}
}
if (opt==-1) for (int i=0,Inv=fastpow(len,mod-2);i<len;++i) P[i]=1ll*P[i]*Inv%mod;
}
int main(){
scanf("%s",s);n=strlen(s);
for (len=1;len<=(n<<1);len<<=1) ++l;--l;
for (int i=0;i<len;++i) rev[i]=(rev[i>>1]>>1)|((i&1)<<l);
for (int i=0;i<n;++i) a[i]=s[i]=='0',b[i]=s[n-i-1]=='1';
ntt(a,1);ntt(b,1);
for (int i=0;i<len;++i) a[i]=1ll*a[i]*b[i]%mod;
ntt(a,-1);
long long ans=1ll*n*n;
for (int i=1;i<n;++i){
int fg=1;
for (int j=i;j<n;j+=i) if (a[n-j-1]|a[n+j-1]) {fg=0;break;}
if (fg) ans^=1ll*(n-i)*(n-i);
}
printf("%lld\n",ans);return 0;
}

[LOJ6436][PKUSC2018]神仙的游戏的更多相关文章

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

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

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

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

  3. BZOJ5372: PKUSC2018神仙的游戏

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

  4. bzoj 5372: [Pkusc2018]神仙的游戏

    Description 小D和小H是两位神仙.他们经常在一起玩神仙才会玩的一些游戏,比如"口算一个4位数是不是完全平方数". 今天他们发现了一种新的游戏:首先称s长度为len的前缀 ...

  5. loj 6436 PKUSC2018 神仙的游戏

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

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

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

  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. 【LOJ6436】【PKUSC2018】神仙的游戏(NTT)

    [LOJ6436][PKUSC2018]神仙的游戏(NTT) 题面 LOJ 题解 看到\(zsy\)从\(PKUSC\)回来就秒掉了这种神仙题 吓得我也赶快看了看\(PKUSC\)都有些什么神仙题 然 ...

随机推荐

  1. Docker的Mysql数据库:把数据存储在本地目录

    Docker mysql 把数据存储在本地目录,很简单,只需要映射本地目录到容器即可 1.加上-v参数 $ docker run -d -e MYSQL_ROOT_PASSWORD=admin --n ...

  2. 20155223 Exp9 Web安全基础实践

    20155223 Exp9 Web安全基础实践 基础问题回答 SQL注入攻击原理,如何防御? 攻击原理:SQL注入即是指web应用程序对用户输入数据的合法性没有判断,攻击者可以在web应用程序中事先定 ...

  3. TPM及TSS协议栈的安装使用

    TPM及TSS协议栈的安装 标签: 可信计算. 目录 安装环境介绍 TPM及TSS安装 软件包下载 TPM 安装 安装TSS 安装tpm-tools 交互过程 编写代码测试TPM是否可用 编写代码测试 ...

  4. 汇编 循环位移指令 ROL, 循环位移指令 ROR

    知识点:  循环位移指令 ROL  循环位移指令 ROR 一.循环位移指令 ROL ROR int i=0x77886611;//01110111100010000110011000010001 ...

  5. java之平台无关

    java虚拟机是执行字节码文件(.class)的虚拟机进程. java源程序(.java)被编译器编译成------>字节码文件(.class),然后字节码文件,将由java虚拟机,解释成--- ...

  6. JS设置状态栏

    JS设置状态栏可通过window.status = str来设置,在后台可通过 ClientScript.RegisterStartupScript( this.GetType(), "12 ...

  7. datatables.js 简单使用--弹出编辑框或添加数据框

    内容:选中某一条记录,弹出编辑框 环境:asp.net mvc ,  bootstrap 显示效果: 代码: 至于怎么弄多选框,在上一篇博客里已经有说明. 主要用到了bootstrap的模态窗,下面代 ...

  8. 记录:Ubuntu 18.04 安装 tensorflow-gpu 版本

    狠下心来重新装了系统,探索一下 gpu 版本的安装.比较令人可喜的是,跟着前辈们的经验,还是让我给安装成功了.由于我是新装的系统,就像婴儿般纯净,所以进入系统的第一步就是安装 cuda,只要这个不出错 ...

  9. Linux使用expect实现免手动密码输入,linux免密码登陆

    使用expect实现自动登录的脚本,网上有很多,可是都没有一个明白的说明,初学者一般都是照抄.收藏.可是为什么要这么写却不知其然.本文用一个最短的例子说明脚本的原理.  脚本代码如下:  ###### ...

  10. PAT甲题题解-1034. Head of a Gang (30)-并查集

    给出n和k接下来n行,每行给出a,b,c,表示a和b之间的关系度,表明他们属于同一个帮派一个帮派由>2个人组成,且总关系度必须大于k.帮派的头目为帮派里关系度最高的人.(注意,这里关系度是看帮派 ...