「PKUSC2018」神仙的游戏 - 题解

「PKUSC2018」神仙的游戏

题意:给出一个01?串,其中?可以代替成为0或1,令 $ F(i) $ 表示是否存在长度为 $ i $ 的border,求 $ (F(1) \times 1 \times 1) \bigoplus (F(2) \times 2 \times 2) \bigoplus (F(3) \times 3 \times 3) \dots \bigoplus (F(n) \times n \times n) $ 。

做法:
对于第一个subtask,枚举每长度的border然后暴力匹配是否存在即可。
对于第二个subtask,字符串哈希判断字符串前后缀是否相同即可。
然后考虑对于一个长度为 $ len $ 的border,那么所有距离为 $ n-len $ 的数字都相同(问号可以转成0或1)。对于一个长度为 $ len $ 的border不存在,当且仅当存在距离为 $ n-len $ 的倍数的数字不同。
对于第四个subtask,枚举记录01的距离即可。
对于第五个subtask,设原串为 $ s $ ,考虑快速记录01距离,当存在距离为x的0和1,都有 $ \sum_{j-i=x}{ [ s[j] != s[i] ] } $ , 若 $ A_{i} = [ s[i] = 1 ] $ , $ B_{i} = [ s[n-i-1] = 1 ] $ , 则 $ A \times B = \sum_{n+j-i=x}{s[j] != s[i]} $ 。FFT/NTT 即可。

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=(a),i##ed=(b);i<=i##ed;i++)
#define per(i,a,b) for(int i=(a),i##ed=(b);i>=i##ed;i--)
using namespace std;
typedef long long ll;
const ll mod=998244353;
const int N=500010;
int n,lmt,l,r[N*4];
char s[N];
ll a[N*4],b[N*4],ans=0;
bool f[N];ll ksm(ll x,ll y) { ll s=1;for(;y;y/=2,x=x*x%mod) if(y%2) s=s*x%mod;return s; }
void ntt(ll *A,int opt) {rep(i,0,lmt-1) if(i<r[i]) swap(A[i],A[r[i]]);for(int mid=1;mid<lmt;mid<<=1) {ll Wn=ksm(opt==1? 3:(mod+1)/3,(mod-1)/(mid<<1));for(int R=mid<<1,j=0;j<lmt;j+=R) {ll w=1;for(int k=0;k<mid;k++,w=w*Wn%mod) {ll x=A[j+k],y=w*A[j+mid+k]%mod;A[j+k]=(x+y)%mod,A[j+mid+k]=(x-y+mod)%mod;}}}if(opt==-1) {ll inv=ksm(lmt,mod-2); rep(i,0,lmt-1) A[i]=A[i]*inv%mod;}
}
int main() {scanf("%s",s+1),n=strlen(s+1);rep(i,1,n) {if(s[i]=='1') a[i-1]=1; else if(s[i]=='0') b[i-1]=1;}reverse(b,b+n);
//  rep(i,0,n-1) printf("%lld ",a[i]); puts("\n");
//  rep(i,0,n-1) printf("%lld ",b[i]); puts("\n");for(lmt=1,l=0;lmt<=n+n;lmt<<=1,++l);rep(i,0,lmt-1) r[i]=(r[i>>1]>>1)|((i&1)<<(l-1));ntt(a,1),ntt(b,1);rep(i,0,lmt-1) a[i]=a[i]*b[i]%mod;ntt(a,-1);
//  rep(i,0,n+n-2) printf("%lld ",a[i]); puts("\n");rep(i,0,n-1) f[i]=(a[n-i-1]==0)&&(a[n+i-1]==0);per(i,n-1,1) if(f[i]) {for(int j=i+i;j<n;j+=i) if(!f[j]) { f[i]=0;break; }}rep(i,1,n) if(f[n-i]) ans^=(ll)i*i;printf("%lld\n",ans);return 0;
}

转载于:https://www.cnblogs.com/daniel14311531/p/10429025.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/463390.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

常用哈希函数的比较及其实现

基本概念 所谓完美哈希函数。就是指没有冲突的哈希函数。即对随意的 key1 ! key2 有h(key1) ! h(key2)。 设定义域为X&#xff0c;值域为Y, n|X|,m|Y|。那么肯定有m>n,假设对于不同的key1,key2属于X,有h(key1)!h(key2)&#xff0c;那么称h为完美哈希函数&#xff0c;当mn时&…

C语言 ,嵌入式 ,c++,数据结构 面试题目(4)

sizeof是C/C中的一个操作符&#xff08;operator&#xff09;&#xff0c;简单的说其作用就是返回一个对象或者类型所占的内存字节数。与strlen的区别&#xff1a;一、sizeof是运算符&#xff0c;确切的说是一个编译时运算符&#xff0c;参数可以是数组、指针、类型、对象、函数…

把链接伪装成按钮

<input type"button" οnclick"location.hrefhttp://www.lemongtree.net/;" value"GO">转载于:https://www.cnblogs.com/xiaoman_890/archive/2009/07/07/1518471.html

c语言中char *name 与char name 的区别

要点&#xff1a;char* name"abc"指的是常量字符串&#xff0c;不可以修改指针&#xff0c;是兼容老的写法&#xff1b;char[] name"abc"是指针&#xff0c;可以修改&#xff1b; 在学习过程中发现了一个以前一直默认的错误&#xff0c;同样char *c "…

Spring事务配置的五种方式

Spring事务配置的五种方式前段时间对Spring的事务配置做了比较深入的研究&#xff0c;在此之间对Spring的事务配置虽说也配置过&#xff0c;但是一直没有一个清楚的认识。通过这次的学习发觉Spring的事务配置只要把思路理清&#xff0c;还是比较好掌握的。总结如下&#xff1a;…

关于SQL数据库中cross join 和inner join用法上的区别?

使用mysql创建两张表 表a 表b 可以使用下面的脚本创建表&#xff0c;并且添加测试数据&#xff1a; CREATE TABLE a ( name varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, sex varchar(2) CHARACTER SET utf8 COLLATE utf8_general_ci NULL D…

CSS实现段落首行缩进、1.5倍行距、左右对齐

.text-content { font-size: 15px; text-indent: 30px; /*段落首行缩进&#xff0c;text-indent的值为font-size的2倍&#xff0c;相当于缩进2个汉字*/ line-height: 22px; /*line-height的值为font-size的1.5倍&#xff0c;即1.5倍行距&#xff0c;使用line-heig…

hash()函数的实现

输入参数都是字符串。 6种hash函数的实现以及使用方式&#xff1a; template<class T> size_t BKDRHash(const T * str) // 该效率最高 { register size_t hash 0; while (size_t ch (size_t)*str) { hash hash * 131 ch; // 也可以乘以31、1…

把数组排成最小的数

题目&#xff1a;输入一个正整数数组&#xff0c;将它们连接起来排成一个数&#xff0c;输出能排出的所有数字中最小的一个。 举例&#xff1a;输入数组{32, 321},则输出这两个能排成的最小数字32132。请给出解决问题的算法&#xff0c;并证明该算法。 答&#xff1a;算法如下&…

【转】 vi常用操作

linux vi命令使用 功能最强大的编辑器——vi vi是所有UNIX系统都会提供的屏幕编辑器&#xff0c;它提供了一个视窗设备&#xff0c;通过它可以编辑文件。当然&#xff0c;对UNIX系统略有所知的人&#xff0c;或多或少都觉得vi超级难用&#xff0c;但vi是最基本的编辑器&#x…

tail的使用

最近找了下tail命令的使用方式&#xff0c;先总结下&#xff1a; tail -f filename 等同于--followdescriptor&#xff0c;根据文件描述符进行追踪&#xff0c;当文件改名或被删除后或者执行ctrlc后&#xff0c;停止追踪 例如&#xff1a;tail -f log/filename.txt ---该…

VS 使用 :新建项目

1.文件位置不放C盘 转载于:https://www.cnblogs.com/duanshouchang/p/10431829.html

C++基础知识友元friend、友元函数和友元类

为了在类之间进行数据共享时&#xff0c;提高效率&#xff0c;C引入了友元的概念。友元主要有三个方面的应用&#xff1a; 将普通函数声明为类的友元函数&#xff1b;将一个类声明为其他类的友元类&#xff1b;将一个类中的成员函数声明为其他类的友元函数。 下面分别介绍。 1、…

Expression Studio 3在windows7下安装失败

Expression Studio 3在windows7下安装失败 Microsoft刚刚发布了Expression Studio 3&#xff0c;我也刚刚下载下来&#xff0c;不过安装就出了问题 双击ExpressionStudio_Trial_en.exe开始解压&#xff0c;开始后就没有了响应&#xff0c;再双击&#xff0c;再解压&#xff0c;…

搞定Linux Shell文本处理工具,看完这篇集锦就够了(转)

Linux Shell是一种基本功&#xff0c;由于怪异的语法加之较差的可读性&#xff0c;通常被Python等脚本代替。既然是基本功&#xff0c;那就需要掌握&#xff0c;毕竟学习Shell脚本的过程中&#xff0c;还是能了解到很多Linux系统的内容。 Linux脚本大师不是人人都可以达到的&a…

出考研初试成绩之后

再次诈尸更新 特殊时期,只憋出来了点压抑的东西来. 考研 考研成绩出来之后就一直没有时间也没有心情写些什么了, 成绩并不好, 可以说是很差了, 好处也有, 就是不用对哪个学校再抱有幻想, 可以专心找工作了.   据说今年的计算机考研人数猛增, 分数也给抬到很高的位置, 以我政治…

Activit系列之---Activity的生命周期

Activity的生命周期 Hello,巴友们好&#xff0c;小菜我又来发博文啦。上篇文章给大家简单的介绍了一下Activity&#xff0c;以及如何创建一个最简单的Activity并且在上面显示hello android! 我们知道要创建一个自己的Activity就必须继承Activity这个类&#xff0c;并且实现它的…

C C++面试常问简答题(1)

1.new、delete、malloc、free关系 delete会调用对象的析构函数,和new对应free只会释放内存&#xff0c;new调用构造函数。malloc与free是C/C语言的标准库函数&#xff0c;new/delete是C的运算符。它们都可用于申请动态内存和释放内存。对于非内部数据类型的对象而言&#xff0c…

CSS hack:针对IE6,IE7,IE8,IE9,firefox显示不同效果

区别不同浏览器的CSS hack写法&#xff1a; 区别IE6与其它浏览器&#xff1a; background:orange;_background:blue; 区别IE6与IE7&#xff1a; background:green !important;background:blue; 区别IE6、IE7与FF&#xff1a; background:orange; *background:green…

CAP定理以及证明

历史 这个定理起源于柏克莱加州大学University of California, Berkeley的计算机科学家埃里克布鲁尔在2000年的分布式计算原则研讨会&#xff08;Symposium on Principles of Distributed Computing&#xff08;PODC&#xff09;&#xff09;上提出的一个猜想。 在2002年&…