传送门

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\) 一下就好了

  1. # include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const int maxn(4e6 + 5);
  5. const double pi(acos(-1));
  6. struct Complex {
  7. double a, b;
  8. inline Complex() {
  9. a = b = 0;
  10. }
  11. inline Complex(double x, double y) {
  12. a = x, b = y;
  13. }
  14. inline Complex operator +(Complex x) const {
  15. return Complex(a + x.a, b + x.b);
  16. }
  17. inline Complex operator -(Complex x) const {
  18. return Complex(a - x.a, b - x.b);
  19. }
  20. inline Complex operator *(Complex x) const {
  21. return Complex(a * x.a - b * x.b, a * x.b + b * x.a);
  22. }
  23. } a[maxn], b[maxn], w[maxn];
  24. int deg, r[maxn], l;
  25. inline void Init(int n) {
  26. register int i, k;
  27. for (deg = 1, l = 0; deg < n; deg <<= 1) ++l;
  28. for (i = 0; i < deg; ++i) r[i] = (r[i >> 1] >> 1) | ((i & 1) << (l - 1));
  29. for (i = 1; i < deg; i <<= 1)
  30. for (k = 0; k < i; ++k) w[deg / i * k] = Complex(cos(pi / i * k), sin(pi / i * k));
  31. }
  32. inline void FFT(Complex *p, int opt) {
  33. register int i, j, k, t;
  34. register Complex wn, x, y;
  35. for (i = 0; i < deg; ++i) if (r[i] < i) swap(p[r[i]], p[i]);
  36. for (i = 1; i < deg; i <<= 1)
  37. for(t = i << 1, j = 0; j < deg; j += t)
  38. for (k = 0; k < i; ++k) {
  39. wn = w[deg / i * k];
  40. if (opt == -1) wn.b *= -1;
  41. x = p[j + k], y = wn * p[i + j + k];
  42. p[j + k] = x + y, p[i + j + k] = x - y;
  43. }
  44. }
  45. int n, len, f[maxn], g[maxn];
  46. ll ans;
  47. char s[maxn];
  48. int main() {
  49. register int i, j;
  50. scanf(" %s", s + 1), n = strlen(s + 1);
  51. for (i = 1; i <= n; ++i) f[i] = s[i] == '0', g[i] = s[n - i + 1] == '1';
  52. for (len = 1; len <= n + n; len <<= 1);
  53. for (i = 1; i <= n; ++i) a[i].a = f[i], b[i].a = g[i];
  54. Init(len), FFT(a, 1), FFT(b, 1);
  55. for (i = 0; i < len; ++i) a[i] = a[i] * b[i];
  56. FFT(a, -1);
  57. for (i = 0; i <= n + n; ++i) f[i] = (int)(a[i].a / len + 0.5);
  58. for (i = 1; i <= n; ++i) g[i] = f[n + 1 - i] + f[n + 1 + i];
  59. for (i = 1; i <= n; ++i)
  60. for (j = i; j <= n; j += i) g[i] |= g[j];
  61. for (i = 1; i <= n; ++i) if (!g[n - i]) ans ^= 1LL * i * i;
  62. printf("%lld\n", ans);
  63. return 0;
  64. }

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

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

    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: [Pkusc2018]神仙的游戏

    Description 小D和小H是两位神仙.他们经常在一起玩神仙才会玩的一些游戏,比如"口算一个4位数是不是完全平方数". 今天他们发现了一种新的游戏:首先称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. 3.3 PXC Strict Mode

    摘要: 出处:黑洞中的奇点 的博客 http://www.cnblogs.com/kelvin19840813/ 您的支持是对博主最大的鼓励,感谢您的认真阅读.本文版权归作者所有,欢迎转载,但请保留该 ...

  2. POJ 2209

    #include<iostream> #include<stdio.h> #include<algorithm> #include<math.h> #d ...

  3. FlowPortal-BPM——数据库交互:创建新接口(类库)—将数据提交给其他程序使用

    使用到的是“流程设计”→“自定义插件” 一.创建新类库 (1)新建类库→引用文件 (2)新建ado.net数据访问类(要操作的数据库) (3)右键类库名称→属性→生成→输出→路径:安装目录下UserD ...

  4. BZOJ AC 300祭!

  5. 基于iTop4412的FM收音机系统设计(三)

    说明:第一版架构为:APP+JNI(NDK)+Driver(linux),优点是开发简单,周期短,也作为自己的毕业设计 现在更新第二版,FM服务完全植入Android系统中,成为系统服务,架构为:AP ...

  6. mysqladmin常用用法

    mysqladmin 工具的使用格式:mysqladmin [option] command [command option] command ...... 参数选项: -c number 自动运行次 ...

  7. jQuery对象扩展方法(Extend)深度解析

    1.这几天在写自己的Js工具类库,所以在编写对象扩展方法,参考了jQuery的对象扩展方法,在编写该方法前,需要掌握js深拷贝和浅拷贝的相关知识,下面是jQuery3.2.1版本对象扩展方法的源码: ...

  8. 安装win7 64位和win10 64位双系统小结

    1.gpt比mbr更先进.与主启动记录 (MBR) 分区方法相比,GPT 具有更多的优点,因为它允许每个磁盘有多达 128 个分区(mbr只支持4个分区),支持高达 18 千兆兆字节的卷大小,允许将主 ...

  9. Innosetup中在安装界面左下角添加超链接

    在程序的安装界面左下角加上超链接,如下图: 1. 新建一个标签,这里使用的控件是TNewStaticText ,完整的方法是 //该方法传入两个参数: //1. ParentForm:将这个URLLa ...

  10. Java的访问权限(public并不等于默认)

    一共有四种访问权限,对应四个范围 1.private :只有本类内可以使用,即使是子类也没权使用 2.protect :子类和友好类能够使用,继承中经常用到 3.默认值,(就是什么都没写),只有同包名 ...