又是一次值得纪念的考试
测试47。
嗯。
题解懒得写了,我要去打FFT了。
(其实是不会写)。
没有看懂的T3代码
#include<bits/stdc++.h> #define F(i,a,b) for(rg int i=a;i<=b;++i) #define rg register #define LL long long #define il inline #define pf(a) printf("%d ",a) #define phn puts("") using namespace std; int read(); /* 1:为什么用next 2:>c*2时,完整循环节末尾不能是0是为了避免有新的循环节,但是如何保证避免的循环不在t集合 3:已有循环节,即t集合,是怎么保证的? 4:为何接后缀 对了,两个nxt不一样。 */ #define N 200010 char a[N]; int n; int nxt[N],c[N],tot,nex[N],b[N]; #define mem(a,x) memset(a,x,sizeof(a)) il void init(){ tot=0; //mem(nxt,0);mem(nex,0);mem(b,0);mem(c,0); } il void work(){ init(); for(rg int i=2,j=0;i<=n;++i){ while(j&&a[j+1]!=a[i])j=nxt[j]; if(a[j+1]==a[i])++j; nxt[i]=j; } rg int x=n; while(x){c[++tot]=x;x=nxt[x];} reverse(c+1,c+tot+1); //F(i,1,tot)pf(c[i]);phn; F(i,1,c[1]-1)b[i]=0;b[c[1]]=1;b[1]=0; rg int p=0; F(i,2,c[1]){ while(p&&b[p+1]!=b[i])p=nex[p]; if(b[p+1]==b[i])++p; nex[i]=p; } F(i,2,tot){ if(c[i-1]*2>=c[i]){ F(j,c[i-1]+1,c[i]){ b[j]=b[j-(c[i]-c[i-1])]; while(p&&b[p+1]!=b[j])p=nex[p]; if(b[p+1]==b[j])++p; nex[j]=p; } } else{ F(j,c[i-1]+1,c[i]-c[i-1]-1){ b[j]=0; while(p&&b[p+1]!=b[j])p=nex[p]; if(b[p+1]==b[j])++p; nex[j]=p; } int ok=1,u=p,w=c[i]-c[i-1]; while(u){ if(b[u+1]==0){ if(w%(w-u-1)==0){ //nex重叠,构成循环节 ok=0;break; } } u=nex[u]; } if(b[u+1]==0){ if(w%(w-u-1)==0){ ok=0; } } b[w]=!ok; while(p&&b[p+1]!=b[w])p=nex[p]; if(b[p+1]==b[w])++p; nex[w]=p; F(j,w+1,c[i]){ b[j]=b[j-w]; while(p&&b[p+1]!=b[j])p=nex[p]; if(b[p+1]==b[j])++p; nex[j]=p; } } } //F(i,1,n)pf(nxt[i]);phn; //F(i,1,n)pf(nex[i]);phn; F(i,1,n)putchar(b[i]+'0');phn; } int main(){ // freopen("1.in","r",stdin); int T=read(); while(T--){ scanf("%s",a+1); n=strlen(a+1); work(); } } il int read(){ int s=0;rg char ch; while(ch=getchar(),!isdigit(ch)); for(;isdigit(ch);s=s*10+(ch^48),ch=getchar()); return s; } /* g++ 1.cpp -g ./a.out 3 YDYYDY JRYJREJRYJR YDYAKYDY */
#include<bits/stdc++.h>
#define F(i,a,b) for(rg int i=a;i<=b;++i)
#define rg register
#define LL long long
#define il inline
#define pf(a) printf("%d ",a)
#define phn puts("")
using namespace std;
int read();
/*
1:为什么用next
2:>c*2时,完整循环节末尾不能是0是为了避免有新的循环节,但是如何保证避免的循环不在t集合
3:已有循环节,即t集合,是怎么保证的?
4:为何接后缀
对了,两个nxt不一样。
*/
#define N 200010
char a[N];
int n;
int nxt[N],c[N],tot,nex[N],b[N];
#define mem(a,x) memset(a,x,sizeof(a))
il void init(){
tot=0;
//mem(nxt,0);mem(nex,0);mem(b,0);mem(c,0);
}
il void work(){
init();
for(rg int i=2,j=0;i<=n;++i){
while(j&&a[j+1]!=a[i])j=nxt[j];
if(a[j+1]==a[i])++j;
nxt[i]=j;
}
rg int x=n;
while(x){c[++tot]=x;x=nxt[x];}
reverse(c+1,c+tot+1);
//F(i,1,tot)pf(c[i]);phn;
F(i,1,c[1]-1)b[i]=0;b[c[1]]=1;b[1]=0;
rg int p=0;
F(i,2,c[1]){
while(p&&b[p+1]!=b[i])p=nex[p];
if(b[p+1]==b[i])++p;
nex[i]=p;
}
F(i,2,tot){
if(c[i-1]*2>=c[i]){
F(j,c[i-1]+1,c[i]){
b[j]=b[j-(c[i]-c[i-1])];
while(p&&b[p+1]!=b[j])p=nex[p];
if(b[p+1]==b[j])++p;
nex[j]=p;
}
}
else{
F(j,c[i-1]+1,c[i]-c[i-1]-1){
b[j]=0;
while(p&&b[p+1]!=b[j])p=nex[p];
if(b[p+1]==b[j])++p;
nex[j]=p;
}
int ok=1,u=p,w=c[i]-c[i-1];
while(u){
if(b[u+1]==0){
if(w%(w-u-1)==0){
//nex重叠,构成循环节
ok=0;break;
}
}
u=nex[u];
}
if(b[u+1]==0){
if(w%(w-u-1)==0){
ok=0;
}
}
b[w]=!ok;
while(p&&b[p+1]!=b[w])p=nex[p];
if(b[p+1]==b[w])++p;
nex[w]=p;
F(j,w+1,c[i]){
b[j]=b[j-w];
while(p&&b[p+1]!=b[j])p=nex[p];
if(b[p+1]==b[j])++p;
nex[j]=p;
}
}
}
//F(i,1,n)pf(nxt[i]);phn;
//F(i,1,n)pf(nex[i]);phn;
F(i,1,n)putchar(b[i]+'0');phn;
}
int main(){
// freopen("1.in","r",stdin);
int T=read();
while(T--){
scanf("%s",a+1);
n=strlen(a+1);
work();
}
}
il int read(){
int s=0;rg char ch;
while(ch=getchar(),!isdigit(ch));
for(;isdigit(ch);s=s*10+(ch^48),ch=getchar());
return s;
}
/*
g++ 1.cpp -g
./a.out
3
YDYYDY
JRYJREJRYJR
YDYAKYDY
*/
原文地址:https://www.cnblogs.com/seamtn/p/11558484.html
- C#通过WMI的wind32 的API函数实现msinfo32的本地和远程计算机的系统日志查看功能
- C#通过WMI的wind32 的API函数实现msinfo32的本地和远程计算机的系统摘要信息查看功能
- Envoy架构概览(5):负载均衡
- Envoy架构概览(6):异常检测
- Envoy架构概览(7):断路,全局限速和TLS
- Envoy架构概览(9):访问日志,MongoDB,DynamoDB,Redis
- 【前沿】TensorFlow Pytorch Keras代码实现深度学习大神Hinton NIPS2017 Capsule论文
- Linux 部署ASP.NET SQLite 应用 的坎坷之旅 附demo及源码
- 跨平台:使用OWIN 为WebAPI 宿主
- 如何在UWP中统一处理不同设备间的页面回退逻辑
- new and override
- 初识SignalR~仿QQ即时聊天(群发,单发)(Web,WPF等Demo演示)【上】
- 【翻译】A Next-Generation Smart Contract and Decentralized Application Platform
- asp.net回调javascript
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Flash写入性能下降问题
- 如何用开源项目申请 JetBrains 产品的 license
- npm -i 与npm install -S与-D的区别以及dependencies与devDependencies的区别
- axios POST提交数据的三种请求方式写法
- 将资源文件编译成源代码文件
- 一道简单的笔试题_时钟切换电路(Glitch-free clock switching circuit)
- 【STM32F429开发板用户手册】第26章 STM32F429的定时器应用之TIM1-TIM14的中断实现
- 【STM32F407开发板用户手册】第26章 STM32F407的定时器应用之TIM1-TIM14的中断实现
- ATTR节点应用
- 等待队列
- samba
- gpio_key按键驱动
- Linux中断下半部实现机制
- linux中led驱动(设备树)编程笔记
- POLL机制