题目分析:

题目要求前后缀相同,把串反过来之后是一个很明显的卷积的形式。这样我们可以完成初步判断(即可以知道哪些必然不行)。

然后考虑一下虽然卷积结果成立,但是存在问号冲突的情况。

箭头之间应当不存在1。不然就和图上所画的一样。注意到它每隔len个跳一次,所以相当于调和级数,利用原有信息判断即可。

字符串转化的方式有很多种。

代码:

 #include<bits/stdc++.h>
using namespace std; const int maxn = (<<)+; const int mod = ;
const int gg = ; char str[maxn]; int n,m,len,a[maxn<<],b[maxn<<],ord[maxn<<]; int f[maxn<<],iv; int fast_pow(int now,int pw){
int ans = ,dd = now,bit = ;
while(bit <= pw){
if(bit & pw) {ans = (1ll*ans*dd)%mod;}
dd = (1ll*dd*dd)%mod;
bit<<=;
}
return ans;
} void fft(int *d,int dr){
for(register int i=;i<m;i++) if(i < ord[i]) swap(d[i],d[ord[i]]);
for(register int i=;i<m;i<<=){
int wn = fast_pow(gg,(mod-)/(*i));
if(dr == -) wn = fast_pow(wn,mod-);
for(register int j=;j<m;j+=(i<<)){
for(register int k=,w=;k<i;k++,w = (1ll*w*wn)%mod){
int x = d[j+k],y = (1ll*w*d[j+k+i])%mod;
d[j+k] = x+y; d[j+k] >=mod?d[j+k]-=mod:;
d[j+k+i] = x-y;
d[j+k+i] < ?d[j+k+i]+=mod:;
}
}
}
if(dr == -){
for(register int i=;i<m;i++) d[i] = (1ll*d[i]*iv)%mod;
}
} void work(){
int n = strlen(str);m = ;
while(m < *n){m<<=;len++;} iv = fast_pow(m,mod-);
for(register int i=;i<m;i++) ord[i] = (ord[i>>]>>)+((i&)<<len-); for(register int i=;i<n;i++) {
if(str[i] == '') a[i] = ;
else if(str[i] == '') b[n-i-] = ;
} fft(a,); fft(b,);
for(register int i=;i<m;i++) {
f[i] = (1ll*a[i]*b[i])%mod;
} memset(a,,sizeof(a)); memset(b,,sizeof(b)); for(register int i=;i<n;i++) {
if(str[i] == '') a[i] = ;
else if(str[i] == '') b[n-i-] = ;
} fft(a,); fft(b,);
for(register int i=;i<m;i++) {
f[i] += (1ll*a[i]*b[i])%mod; if(f[i] >mod)f[i]-=mod;
} fft(f,-); for(register int i=;i<n-;i++){
int now = n--i;
for(register int j=i-now;j>=;j-=now){
f[i] |= f[j];
}
} long long ans = ;
for(register int i=;i<=n;i++){
ans ^= (1ll*(f[i-]==)*i*i);
}
printf("%lld",ans);
} int main(){
scanf("%s",str);
work();
return ;
}

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

  1. [LOJ6436][PKUSC2018]神仙的游戏

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

  2. [PKUSC2018]神仙的游戏(FFT)

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

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

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

  4. BZOJ5372: PKUSC2018神仙的游戏

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

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

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

  6. loj 6436 PKUSC2018 神仙的游戏

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

  7. [PKUSC2018]神仙的游戏

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

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

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

  9. 【LOJ6436】【PKUSC2018】神仙的游戏(NTT)

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

随机推荐

  1. H5 68-伪元素选择器

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. FreeBSD常用操作

    导读 最近遇到一些FreeBSD的故障,在这种操作系统上我们平时用的一些命令无法执行,FreeBSD的一些配置文件也和其他很多Linux系统不一样.为了方便以后查阅,我特别整理了这篇文档. 1. 网络 ...

  3. django的配置文件字符串是怎么导入的?

    写在开头: 每个APP都会有配置文件,像下代码Django等等这种的settings里面的配置导入都是字符串的,他们是怎么做的呢? MIDDLEWARE = [ 'django.middleware. ...

  4. Python之字符串操作

    一.字符串特点 内容不可修改 password=' #内容不可修改 二.字符串常用方法 1..strip()方法 去字符串两边的空格和换行符 print(password.strip()) #去掉字符 ...

  5. Java 常见编码格式——URL、Base64

    数据编码 我们对数据进行编码是因为在某些情况下,不能直接传输中文字符或者其他字符,比如在设置http协议的头部信息或者cookie时,如果value有中文字符,那么就需要将中文字符使用某种编码方式进行 ...

  6. Swagger UI 用法

    Swagger - 简书https://www.jianshu.com/p/4115f2b53983 Swagger简介 - Ghost Stories - CSDN博客https://blog.cs ...

  7. httpd sshd firewalld 服务后面的d的意思

    在操作系统中,一般系统的服务都是以后台进程的方式存在,而且都会常驻系统中,直到关机才结束.这类服务也称Daemon,在Linux系统中就包含许多的Daemon. 判断Daemon最简单的方法就是从名称 ...

  8. Yii的操作提示框

    效果如图 HTML + CSS<style> div.error{ background: #FFE0E0; border: 2px solid #FFA0A0; padding: 10p ...

  9. Java 里如何实现线程间通信(转载)

    出处:http://www.importnew.com/26850.html 正常情况下,每个子线程完成各自的任务就可以结束了.不过有的时候,我们希望多个线程协同工作来完成某个任务,这时就涉及到了线程 ...

  10. [转帖]wifi 4G 和 蓝牙的区别

    作者:沈万马链接:https://www.zhihu.com/question/64739486/answer/225227838来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...