【CF827E】Rusty String

题意:给你一个01串,其中部分字符是'?',?可以是0或1,求所有可能的d,满足存在一种可能得到的01串,在向右移动d格后与自己相同。

$n\le 5\times 10^5$

题解:我们先枚举d,那么一个串符合条件当且仅当:$\forall i \in [0,d), a_i=a_{i+d}=a_{i+2d}=...$,我们可以用fft来判断是否相等。具体地,我们令a串代表正串中的V,b串代表反串中的K,求a和b的卷积c,这样只需要判断$c_d,c_{2d},c_{3d}...$是否都是0就行了。时间复杂度$O(n \log n)$。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
#include <algorithm>
#define pi acos(-1.0)
using namespace std;
struct cp
{
double x,y;
cp () {}
cp (double a,double b) {x=a,y=b;}
cp operator + (const cp &a) const {return cp(x+a.x,y+a.y);}
cp operator - (const cp &a) const {return cp(x-a.x,y-a.y);}
cp operator * (const cp &a) const {return cp(x*a.x-y*a.y,x*a.y+y*a.x);}
}l1[1<<20],l2[1<<20];
int n,len,top;
int v[1<<20],sta[500010];
char str[500010];
inline void FFT(cp *a,int f)
{
int i,j,k,h;
for(i=k=0;i<len;i++)
{
if(i>k) swap(a[i],a[k]);
for(j=len>>1;(k^=j)<j;j>>=1);
}
cp t;
for(h=2;h<=len;h<<=1)
{
cp wn(cos(2*pi*f/h),sin(2*pi*f/h));
for(i=0;i<len;i+=h)
{
cp w(1,0);
for(j=i;j<i+h/2;j++) t=w*a[j+h/2],a[j+h/2]=a[j]-t,a[j]=a[j]+t,w=w*wn;
}
}
}
inline void work()
{
scanf("%d%s",&n,str);
for(len=1;len<2*n;len<<=1);
int i,j;
for(i=0;i<n;i++) l1[i].x=(str[i]=='V'),l2[i].x=(str[n-i-1]=='K');
FFT(l1,1),FFT(l2,1);
for(i=0;i<len;i++) l1[i]=l1[i]*l2[i];
FFT(l1,-1);
for(i=0;i<len;i++) v[i]=int(l1[i].x/len+0.5);
for(top=0,i=1;i<=n;i++)
{
for(j=(n-1)%i;j<2*n;j+=i) if(v[j]) break;
if(j>=2*n) sta[++top]=i;
}
printf("%d\n",top);
for(i=1;i<=top;i++) printf("%d%c",sta[i],i==top?'\n':' ');
memset(l1,0,sizeof(l1[0])*(len+1)),memset(l2,0,sizeof(l2[0])*(len+1));
}
int main()
{
int T;
scanf("%d",&T);
while(T--) work();
return 0;
}//3 5 V??VK 6 ?????? 4 ?VK?

【CF827E】Rusty String 调和级数+FFT的更多相关文章

  1. 【题解】Rusty String [CF827E]

    [题解]Rusty String [CF827E] 传送门:\(\text{Rusty String}\) \(\text{[CF827E]}\) [题目描述] 多组数据,每组数据给出一个由 \(V, ...

  2. Codeforces 827E Rusty String - 快速傅里叶变换 - 暴力

    Grigory loves strings. Recently he found a metal strip on a loft. The strip had length n and consist ...

  3. E. Rusty String

    E. Rusty String time limit per test 3 seconds memory limit per test 512 megabytes input standard inp ...

  4. CF 827E Rusty String FFT

    传送门 如果没有碍事的?的话,判定字符串的循环节直接用KMP的失配数组就可以搞定.现在有了碍事的?,我们就需要考虑更通用的算法. 考虑KMP失配数组判定字符串循环节的本质,发现判定\(k\)是否为字符 ...

  5. 牛客网暑期ACM多校训练营(第三场)DEncrypted String Matching fft

    题意:给你一个解密后的字符串,给你加密方式,加密过程可能出错,字符可能加减1,然后给你一个字符串,要求匹配个数(其实我也不太懂具体怎么加密解密,反正你把给你的前两个字符串用第三个加密一下,然后搞可以有 ...

  6. Rusty String

    题意: 给定一个含有两种字符'V','K'以及?的字符串,问该串可能的循环节. 解法: 首先如果对于$d$,我们有不存在 $(j-i) | d$ 且 $S_i = 'V',  S_j = 'K'$ 的 ...

  7. FFT(快速傅立叶算法 for java)

    package com.test.test2; public class FFT {     public static final int FFT_N_LOG = 10; // FFT_N_LOG ...

  8. 【CF954I】Yet Another String Matching Problem(FFT)

    [CF954I]Yet Another String Matching Problem(FFT) 题面 给定两个字符串\(S,T\) 求\(S\)所有长度为\(|T|\)的子串与\(T\)的距离 两个 ...

  9. 2018牛客网暑假ACM多校训练赛(第三场)D Encrypted String Matching 多项式 FFT

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round3-D.html 题目传送门 - 2018牛客多校赛第三场 D ...

随机推荐

  1. js粘贴事件paste简单解析及遇到的坑

    在用户执行粘贴操作的时候,js能够获得剪切板的内容,本文讨论一下这个问题. 目前只有Chrome支持获取剪切板中的图片数据.还好需要这个功能的产品目前只支持Chrome和Safari,一些Chrome ...

  2. mongodb:修改oplog.rs 的大小size

    其内容字段说明: ts:操作日志的timestamp t: 未知? h:操作唯一随机值 v:oplog.rs的版本 op:操作类型: i:insert操作 u:update操作 d:delete操作 ...

  3. ExtJS中给Tree节点加click事件

    第一种: 直接通过TreePanel中的Config Option中的listener来添加,代码如下: var TreePan = new Ext.tree.TreePanel({ id: 'Tre ...

  4. “NHibernate.Cfg.Configuration 的类型初始值设定项引发异常。”的解决方法【备忘】

    今天搞到NHibernate时,突然报了一个“NHibernate.Cfg.Configuration 的类型初始值设定项引发异常.”的异常. 详细异常信息“System.IO.FileLoadExc ...

  5. linux环境中,查看域名的DNS信息?

    需求说明: 今天在linux主机上,要查询一个域名是在哪个DNS上进行解析的,这个域名下面还有哪些的地址 操作过程: 1.linux环境中通过nslookup命令来进行查看 [deployer@CBS ...

  6. windows 环境下 ping 加时间戳 记日志

    在c盘下面新建文件 ping.vbs 在 ping.vbs中输入代码如下: Dim args, flag, unsuccOut args="" otherout="&qu ...

  7. Linux下tomcat无法启动

    场景:干净的tomcat,刚解压 1 通过./startup.sh,提示启动成功,但查看没有日志 2 通过netstat -tln查看端口,发现找不到8080 3 通过./catalina.sh ru ...

  8. scala try monad

    当输入的数据格式不正确时,ActivityData 中会出现 OutofIndex 错误,但更多的时候我们只关心想要的结果而不想了解出现了怎样的错误,然后会写出这样的代码   def parseCSV ...

  9. Jenkins构建触发器

       我们在执行Jenkins的项目构建的时候一般都是通过web管理界面中的”构建”来执行项目构建操作,但是除此之外我们还可以通过项目配置中的”构建触发器”来触发构建操作, 其中”构建触发器”有一种方 ...

  10. 解决16bit压缩贴图失真问题

    选择索引模式