BZOJ5372: PKUSC2018神仙的游戏

时间:2022-09-22 21:23:11

传送门

Sol

自己还是太 \(naive\) 了,上来就构造多项式和通配符直接匹配,然后遇到 \(border\) 相交的时候就 \(gg\) 了

神仙的游戏蒟蒻还是玩不来

一个小小的性质:

存在长度为 \(len\) 的 \(border\) 的充要条件是 \(\forall i,s_i=s_{n-len+i}\)

等价于按照 \(n-len\) 的剩余系分类,那么每一类都要求不同时含有 \(0,1\)

考虑两个位置 \(i,j\) 分别为 \(0,1\) 会对于哪一些长度的 \(border\) 有影响

显然是满足 \(|i-j|\equiv 0 (mod~n-len)\) 的 \(len\),即 \((n-len)|(|i-j|)\)

设 \(f_x\) 表示 \(|i-j|=x\) 是否存在 \(s_i,s_j\) 分别为 \(0,1\)

这个是一个经典套路

只要对于 \(s_i=1\) 和 \(s_i=0\) 分别构造函数,\(FFT\) 一下就好了

# include <bits/stdc++.h>
using namespace std;
typedef long long ll; const int maxn(4e6 + 5);
const double pi(acos(-1)); struct Complex {
double a, b; inline Complex() {
a = b = 0;
} inline Complex(double x, double y) {
a = x, b = y;
} inline Complex operator +(Complex x) const {
return Complex(a + x.a, b + x.b);
} inline Complex operator -(Complex x) const {
return Complex(a - x.a, b - x.b);
} inline Complex operator *(Complex x) const {
return Complex(a * x.a - b * x.b, a * x.b + b * x.a);
}
} a[maxn], b[maxn], w[maxn]; int deg, r[maxn], l; inline void Init(int n) {
register int i, k;
for (deg = 1, l = 0; deg < n; deg <<= 1) ++l;
for (i = 0; i < deg; ++i) r[i] = (r[i >> 1] >> 1) | ((i & 1) << (l - 1));
for (i = 1; i < deg; i <<= 1)
for (k = 0; k < i; ++k) w[deg / i * k] = Complex(cos(pi / i * k), sin(pi / i * k));
} inline void FFT(Complex *p, int opt) {
register int i, j, k, t;
register Complex wn, x, y;
for (i = 0; i < deg; ++i) if (r[i] < i) swap(p[r[i]], p[i]);
for (i = 1; i < deg; i <<= 1)
for(t = i << 1, j = 0; j < deg; j += t)
for (k = 0; k < i; ++k) {
wn = w[deg / i * k];
if (opt == -1) wn.b *= -1;
x = p[j + k], y = wn * p[i + j + k];
p[j + k] = x + y, p[i + j + k] = x - y;
}
} int n, len, f[maxn], g[maxn];
ll ans;
char s[maxn]; int main() {
register int i, j;
scanf(" %s", s + 1), n = strlen(s + 1);
for (i = 1; i <= n; ++i) f[i] = s[i] == '0', g[i] = s[n - i + 1] == '1';
for (len = 1; len <= n + n; len <<= 1);
for (i = 1; i <= n; ++i) a[i].a = f[i], b[i].a = g[i];
Init(len), FFT(a, 1), FFT(b, 1);
for (i = 0; i < len; ++i) a[i] = a[i] * b[i];
FFT(a, -1);
for (i = 0; i <= n + n; ++i) f[i] = (int)(a[i].a / len + 0.5);
for (i = 1; i <= n; ++i) g[i] = f[n + 1 - i] + f[n + 1 + i];
for (i = 1; i <= n; ++i)
for (j = i; j <= n; j += i) g[i] |= g[j];
for (i = 1; i <= n; ++i) if (!g[n - i]) ans ^= 1LL * i * i;
printf("%lld\n", ans);
return 0;
}

BZOJ5372: PKUSC2018神仙的游戏的更多相关文章

  1. BZOJ5372&colon; &lbrack;Pkusc2018&rsqb;神仙的游戏

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

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

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

  3. bzoj 5372&colon; &lbrack;Pkusc2018&rsqb;神仙的游戏

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

  4. LOJ6436 &lbrack;PKUSC2018&rsqb; 神仙的游戏 【FFT】

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

  5. loj 6436 PKUSC2018 神仙的游戏

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

  6. &lbrack;LOJ6436&rsqb;&lbrack;PKUSC2018&rsqb;神仙的游戏

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

  7. &lbrack;PKUSC2018&rsqb;神仙的游戏&lpar;FFT&rpar;

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

  8. &lbrack;PKUSC2018&rsqb;神仙的游戏

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

  9. LOJ &num;6436&period; 「PKUSC2018」神仙的游戏&lpar;字符串&plus;NTT&rpar;

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

随机推荐

  1. vue入门学习(基础篇)

    vue入门学习总结: vue的一个组件包括三部分:template.style.script. vue的数据在data中定义使用. 数据渲染指令:v-text.v-html.{{}}. 隐藏未编译的标 ...

  2. chrome插件编写之新版hello world

    编写chrome插件之前,需要熟悉一下相应的chrome插件开发环境.从编写hello world开始,参考阅读官方的教程,是一个不错的选择.这里主要是基于chrome的官方教程,稍稍做了一些修改和扩 ...

  3. relatedTarget、fromElement、toElement之间的关系

    在发生mouseover和mouseout事件时会把鼠标指针从一个元素的边界之内移到另一个元素边界之内.对 mouseover事件而言,事件的target是获得光标的元素,而relatedTarget ...

  4. JSTL标签用法 详解

    在JSP的开发中,迭代是经常要使用到的操作.例如,逐行的显示查询的结果等.在早期的JSP中,通常使用Scriptlets来实现Iterator或者Enumeration对象的迭代输出.现在,通过JST ...

  5. Java中的10颗语法糖

    语法糖(Syntactic Sugar):也称糖衣语法,指在计算机语言中添加的某种语法,这种语法对语言的功能没有影响,但是更方便程序员使用.通常来说,使用语法糖能够增加程序的可读性,减少程序代码出错的 ...

  6. 写自己的WPF样式 - 按钮

    做一个后台管理小程序,据说WPF的界面比较"炫",于是选择使用WPF来开发.既然用了WPF当然需要做好看点了,于是稍微研究了下WPF的样式,废话不多说下面开始自定义一个按钮样式: ...

  7. View实现涂鸦、撤销以及重做功能

    import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import j ...

  8. poj1182食物链(种类并查集)

    http://poj.org/problem?id=1182 r[x] = 0 表示x和父亲是同类r[x] = 1 表示x吃父亲r[x] = 2 表示x被父亲吃因为只存在三种动物,且三种动物构成了环形 ...

  9. 利用U盘安装win2008r2系统的步骤

    我们在公司或者家里,经常要安装各种系统,最近公司需要重新安装win2008r2系统.折腾了一天的时间,终于把系统装好了.将安装的步骤记录下来,方便大家查看,自己也做个记录. 1 准备win2008r2 ...

  10. 遗传算法(GA)

    来自:https://blog.csdn.net/u010451580/article/details/51178225 遗传算法是模仿生物进化机制的随机全局搜索和优化方法.借鉴达尔文进化论和孟德尔的 ...