BZOJ5372: PKUSC2018神仙的游戏
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神仙的游戏的更多相关文章
- BZOJ5372: [Pkusc2018]神仙的游戏
		
BZOJ5372: [Pkusc2018]神仙的游戏 https://lydsy.com/JudgeOnline/problem.php?id=5372 分析: 如果\(len\)为\(border\ ...
 - BZOJ5372 PKUSC2018神仙的游戏(NTT)
		
首先有一个想法,翻转串后直接卷积看有没有0匹配上1.但这是必要而不充分的因为在原串和翻转串中?不能同时取两个值. 先有一些结论: 如果s中长度为len的前缀是border,那么其存在|s|-len的循 ...
 - bzoj 5372: [Pkusc2018]神仙的游戏
		
Description 小D和小H是两位神仙.他们经常在一起玩神仙才会玩的一些游戏,比如"口算一个4位数是不是完全平方数". 今天他们发现了一种新的游戏:首先称s长度为len的前缀 ...
 - LOJ6436 [PKUSC2018] 神仙的游戏 【FFT】
		
题目分析: 题目要求前后缀相同,把串反过来之后是一个很明显的卷积的形式.这样我们可以完成初步判断(即可以知道哪些必然不行). 然后考虑一下虽然卷积结果成立,但是存在问号冲突的情况. 箭头之间应当不存在 ...
 - loj 6436 PKUSC2018 神仙的游戏
		
传送门 好妙蛙 即串\(s\)长度为\(n\)首先考虑如果一个长度为\(len\)的\(border\)存在,当且仅当对所有\(i\in[1,len],s[i]=s[n-len+i]\),也就是所有模 ...
 - [LOJ6436][PKUSC2018]神仙的游戏
		
loj description 给你一个只有01和?的字符串,问你是否存在一种把?改成01的方案使串存在一个长度为\(1-n\)的\(border\).\(n\le5\times10^5\) sol ...
 - [PKUSC2018]神仙的游戏(FFT)
		
给定一个01?串,对所有len询问是否存在一种填法使存在长度为len的border. 首先有个套路的性质:对于一个长度为len的border,这个字符串一定有长度为n-len的循环节(最后可以不完整) ...
 - [PKUSC2018]神仙的游戏
		
题目 画一画就会发现一些奇诡的性质 首先如果\(len\)为一个\(\operatorname{border}\),那么必然对于\(\forall i\in [1,len]\),都会有\(s_i=s_ ...
 - LOJ #6436. 「PKUSC2018」神仙的游戏(字符串+NTT)
		
题面 LOJ #6436. 「PKUSC2018」神仙的游戏 题解 参考 yyb 的口中的长郡最强选手 租酥雨大佬的博客 ... 一开始以为 通配符匹配 就是类似于 BZOJ 4259: 残缺的字符串 ...
 
随机推荐
- iOS学习笔记(3)--初识UINavigationController(无storyboard)
			
纯代码创建导航控制器UINavigationController 在Xcode6.1中创建single view application的项目,删除Main.storyboard文件,删除info.p ...
 - iOS开发~制作同时支持armv7,armv7s,arm64,i386,x86_64的静态库.a以及 FrameWork 的创建
			
armv7,armv7s,arm64,i386,x86_64 详解 一.概要 平时项目开发中,可能使用第三方提供的静态库.a,如果.a提供方技术不成熟,使用的时候就会出现问题,例如: 在真机上编译报错 ...
 - find查找文件命令 - Linux系统中的常用技巧整理
			
“find”在Linux系统中是比较常用的文件查找命令,使用方法有很多,可以拥有查找文件.文件目录.文件更新时间.文件大小.文件权限及对比文件时间.下面是整理的“find”常用方法,方便以后需要的时候 ...
 - fd与FILE结构体
			
文件描述符 fd 概念:文件描述符在形式上是一个非负整数.实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表.当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件 ...
 - postman小结
			
1.get和post请求,get有限制2k,post没有限制post安全 在选择的时候别把get post选错然后,run 2.data 选成txt文件 utf-8 ip ip,result12.1 ...
 - angularJs集成百度地图
			
app.controller('mapSignController',function($scope,$rootScope,Message, $window,$uibModalInstance){ v ...
 - pycharm+gitee
			
Git操作 前言: 由于各种原因,很多时候我们写代码的电脑并不会随身携带,所以有的时候突发灵感想继续写代码就变得难以实现.相信大部分同学对此都有了解,那就通过代码托管平台来管理.原本想用GitHub来 ...
 - 皕杰报表 javax.naming.NameNotFoundException: Name jdbc is not bound in this Context
			
今天做报表的时候,跳转到显示报表页面的时候不出来数据,报错说数据集未产生. 后台报错 javax.naming.NameNotFoundException: Name jdbc is not boun ...
 - php  前台生成多维数组 后台批量添加
			
同一个地方绊倒两次,记录一下哈 1)前台表单,看 name <div class="tab-pane row " id="tab-1" > < ...
 - 【HNOI2019】部分题简要题解
			
题意懒得写了 LOJ Day 1 T1 鱼 个人做法比较猎奇,如果有哪位大佬会证明能分享一下的话感激不尽. 题解:枚举鱼尾和鱼身的交点D,将所有其他点按照到D的距离排序,距离相同的分一组. 感性的理解 ...