题目:https://loj.ac/problem/6436

看题解才会。

有长为 i 的 border ,就是有长为 n-i 的循环节。

考虑如果 x 位置上是 0 、 y 位置上是 1 ,那么长度是 | x-y | 的约数的循环节都不可行,因为在该循环节中, x 和 y 处在 “应该相等” 的地位。

最后一个部分分是暴力枚举 0 和 1 来预处理出一个 h[ i ] 表示长度是 i 的约数的循环节不可行。然后枚举循环节的长度 i ,再枚举 i 的倍数看看有没有 “不可行” 的。这样是 nlogn 。

考虑用卷积来优化求 h[ ] 。就是想找 “位置差一定” 的一个 0 和一个 1 ;令 \( F(x) = \sum [ s[i]=='0' ] x^i \) ,\( G(x) = \sum [ s[i]=='1' ] x^i \) ,翻转其中一个,做卷积即可。

感觉很卡常。没有 ' ? ' 的那个子任务,自己必须特判(用 kmp 做)才能不超时。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #define ll long long
  5. using namespace std;
  6. const int N=5e5+,M=(<<)+,mod=;
  7. int upt(int x){while(x>=mod)x-=mod;while(x<)x+=mod;return x;}
  8. int pw(int x,int k)
  9. {int ret=;while(k){if(k&)ret=(ll)ret*x%mod;x=(ll)x*x%mod;k>>=;}return ret;}
  10.  
  11. int n,f[M],g[M],len,r[M];char s[N];
  12. int wn[M],wn2[M],nxt[N];
  13. void ntt_init()
  14. {
  15. for(int R=;R<=len;R<<=)
  16. {
  17. wn[R]=pw(,(mod-)/R);
  18. wn2[R]=pw(,(mod-)-(mod-)/R);
  19. }
  20. }
  21. void ntt(int *a,bool fx)
  22. {
  23. for(int i=;i<len;i++)
  24. if(i<r[i])swap(a[i],a[r[i]]);
  25. for(int R=;R<=len;R<<=)
  26. {
  27. int Wn=(fx?wn2[R]:wn[R]);
  28. for(int i=,m=R>>;i<len;i+=R)
  29. for(int j=,w=;j<m;j++,w=(ll)w*Wn%mod)
  30. {
  31. int x=a[i+j],y=(ll)w*a[i+m+j]%mod;
  32. a[i+j]=upt(x+y); a[i+m+j]=upt(x-y);
  33. }
  34. }
  35. if(!fx)return; int inv=pw(len,mod-);
  36. for(int i=;i<len;i++)a[i]=(ll)a[i]*inv%mod;
  37. }
  38. void kmp()
  39. {
  40. for(int i=n;i;i--)s[i]=s[i-];
  41. for(int i=;i<=n;i++)
  42. {
  43. int cr=nxt[i-];
  44. while(cr&&s[cr+]!=s[i])cr=nxt[cr];
  45. if(s[cr+]==s[i])nxt[i]=cr+;
  46. else nxt[i]=;
  47. }
  48. ll ans=(ll)n*n;
  49. int cr=nxt[n];
  50. while(cr)
  51. {
  52. ans^=(ll)cr*cr; cr=nxt[cr];
  53. }
  54. printf("%lld\n",ans);
  55. }
  56. int main()
  57. {
  58. scanf("%s",s); n=strlen(s); bool chk=;
  59. for(int i=;i<n;i++)
  60. {
  61. f[i]=(s[i]==''); g[n--i]=(s[i]=='');
  62. if(s[i]=='?')chk=;
  63. }
  64. if(!chk){ kmp();return ;}
  65. for(len=;len<n<<;len<<=);
  66. for(int i=,j=len>>;i<len;i++)
  67. r[i]=(r[i>>]>>)+((i&)?j:);
  68. ntt_init();
  69. ntt(f,); ntt(g,);
  70. for(int i=;i<len;i++)f[i]=(ll)f[i]*g[i]%mod;
  71. ntt(f,);
  72. for(int i=;i<n;i++)g[i]=((f[n--i]||f[n-+i])?:);
  73. ll ans=(ll)n*n;
  74. for(int i=;i<n;i++)
  75. {
  76. int x=n-i; bool fg=;
  77. for(int j=x;j<n;j+=x)
  78. if(g[j]){fg=;break;}
  79. if(!fg)ans^=(ll)i*i;
  80. }
  81. printf("%lld\n",ans);
  82. return ;
  83. }

LOJ 6436 「PKUSC2018」神仙的游戏——思路+卷积的更多相关文章

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

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

  2. loj#6436. 「PKUSC2018」神仙的游戏(生成函数)

    题意 链接 Sol 生成函数题都好神仙啊qwq 我们考虑枚举一个长度\(len\).有一个结论是如果我们按\(N - len\)的余数分类,若同一组内的全为\(0\)或全为\(1\)(?不算),那么存 ...

  3. LOJ #6436. 「PKUSC2018」神仙的游戏

    题目分析 通过画图分析,如果存在border长度为len,则原串一定是长度为n-len的循环串. 考虑什么时候无法形成长度为len的循环串. 显然是两个不同的字符的距离为len的整数倍时,不存在这样的 ...

  4. loj#6436. 「PKUSC2018」神仙的游戏(NTT)

    题面 传送门 题解 一旦字符串踏上了通配符的不归路,它就永远脱离了温暖的字符串大家庭的怀抱 用人话说就是和通配符扯上关系的字符串就不是个正常的字符串了比如说这个 让我们仔细想想,如果一个长度为\(le ...

  5. 【LOJ】#6436. 「PKUSC2018」神仙的游戏

    题解 感觉智商为0啊QAQ 显然对于一个长度为\(len\)的border,每个点同余\(n - len\)的部分必然相等 那么我们求一个\(f[a]\)数组,如果存在\(s[x] = 0\)且\(s ...

  6. 「PKUSC2018」神仙的游戏

    题目链接 比如说上面\(|S|\)为12的字符串,我们欲求出\(f(9)\)的值,那么上面相同颜色的字符必须两两能够匹配.也就是说,同种颜色的字符集里不能同时出现0和1.如果只考虑同种颜色集里相邻的两 ...

  7. LOJ6436. 「PKUSC2018」神仙的游戏 [NTT]

    传送门 思路 首先通过各种手玩/找规律/严谨证明,发现当\(n-i\)为border当且仅当对于任意\(k\in[0,i)\),模\(i\)余\(k\)的位置没有同时出现0和1. 换句话说,拿出任意一 ...

  8. LOJ #6435. 「PKUSC2018」星际穿越(倍增)

    题面 LOJ#6435. 「PKUSC2018」星际穿越 题解 参考了 这位大佬的博客 这道题好恶心啊qwq~~ 首先一定要认真阅读题目 !! 注意 \(l_i<r_i<x_i\) 这个条 ...

  9. LOJ #6432. 「PKUSC2018」真实排名(组合数)

    题面 LOJ #6432. 「PKUSC2018」真实排名 注意排名的定义 , 分数不小于他的选手数量 !!! 题解 有点坑的细节题 ... 思路很简单 , 把每个数分两种情况讨论一下了 . 假设它为 ...

随机推荐

  1. mysqldump - 备份 MySQL 数据库

    参考资料 备份 备份所有数据库中的所有数据(包括系统数据库) –all-databases 通过 --all-databases 选项备份所有的数据库: mysqldump -uroot -p --a ...

  2. JSP表单提交 与 接受显示

    Demo01.jsp 提交表单输入的信息至 Demo02.jsp方法一 1 <%@ page language="java" contentType="text/h ...

  3. SmokeTest测试流程

    没办法了,本来是表格,但是粘贴不过来 测试目的: 用于检测该版本在基本的应用场景下,基本的功能是否满足. 测试前提: 发货版本 示例:ATV9冒烟测试测试项解读 表格获取:Google ATV hel ...

  4. ICPC2019上海区域赛 部分题解(正在更新)

    K. Color Graph 题意: 给定一个简单图,点个数<=16,删去部分边后,使得该图中无边数为奇数得环,问剩下的边数最大为多少? 思路: 如果一个图中无奇数边的环,那么这个图一定是个二分 ...

  5. 【NOIP2017】列队【可持久化线段树】

    题目链接 题目描述 Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有n×mn×m名学生,方阵的行数为 n ...

  6. mybatis注解开发实体类属性和数据库字段不对应问题

    /** * 查询所有用户 * @return */ @Select("select * from user") @Results(id="userMap",va ...

  7. knn 数据集准备

    """ Created on Mon Aug 26 20:57:24 2019 @author: huoqs knn algorithm ""&quo ...

  8. BZOJ 4821 (luogu 3707)(全网最简洁的代码实现之一)

    题面 传送门 分析 计算的部分其他博客已经写的很清楚了,本博客主要提供一个简洁的实现方法 尤其是pushdown函数写得很简洁 代码 #include<iostream> #include ...

  9. 关联查询总结,left join 和 inner join 区别和优化

    left join 是做左外关联,主表内容都会显示:符合关联条件的附表内容才会显示出来. inner join 是内关联,没有主表附表的概念:两个表中,同时符合关联条件的数据才会显示出来. left ...

  10. wangEditor 文本编辑器

    参考:https://www.cnblogs.com/Scholars/p/8968838.html 下载:http://www.wangeditor.com/ 前端代码: <script ty ...