codeforces 526 d Om Nom and Necklace next数组的灵活运用

codeforces 526 d Om Nom and Necklace

题意:

给出一个字符串,问对于字符串的每个位置p,求从0到p的字符串是否符合格式:S=A+B+A+B+A+...+A+B+A,其中A,B是字符串,且可以是空串。

限制:

字符串长度1e6

思路:

next数组的灵活运用。

/*codeforces 526 d Om Nom and Necklace
  题意:
  给出一个字符串,问对于字符串的每个位置p,求从0到p的字符串是否符合格式:S=A+B+A+B+A+...+A+B+A,其中A,B是字符串,且可以是空串。
  限制:
  字符串长度1e6
  思路:
  next数组的灵活运用。
 */
#include<iostream>
#include<cstdio>
using namespace std;
const int N = 1000005;
int nxt[N];
char S[N], T[N];
int slen, tlen;
void getNext(){
	int i,j;
	j=nxt[0]=-1;
	for(int i=1;i<tlen;++i){
		while(j!=-1 && T[i]!=T[j+1]) j=nxt[j];
		if(T[j+1]==T[i]) j++;
		nxt[i]=j;
	}
}
char ans[N];
bool zc[N];
int main(){
	int n,k;
	scanf("%d%d",&n,&k);
	scanf("%s",T);
	tlen=n;
	getNext();
	//for(int i=1;i<=n;++i){
	//	cout<<i<<' '<<nxt[i]<<endl;
	//}
	for(int i=0;i<n;++i){
		int p=i+1;
		int bl=p/(p-1-nxt[p-1]);
		if(p%(p-1-nxt[p-1])==0){
			if(bl/k>=bl%k) putchar('1');
			else putchar('0');
		}
		else{
			if(bl/k>bl%k) putchar('1');
			else putchar('0');
		}
	}
	puts("");
	return 0;
}

时间: 2024-12-29 06:28:29

codeforces 526 d Om Nom and Necklace next数组的灵活运用的相关文章

Codeforces 526D - Om Nom and Necklace 【KMP】

ZeptoLab Code Rush 2015 D. Om Nom and Necklace [题意] 给出一个字符串s,判断其各个前缀是否是 ABABA…ABA的形式(A和B都可以为空,且A有Q+1个,B有Q个,Q给定). [官方题解] 对于前缀P,我们可以把它拆成P=SSSS…SSSST,其中T是S的前缀.显然可以用KMP算法,时间复杂度是O(n). 当T=S:P=SSS…S.假设S出现了R次.如果转换为ABABAB…ABABA的形式,A和B是由几个S组成,而且最后的A一定是P的一个后缀.由

Codeforces 526D Om Nom and Necklace (KMP)

http://codeforces.com/problemset/problem/526/D 题意 给定一个串 T,对它的每一个前缀能否写成 A+B+A+B+...+B+A+B+A+B+...+B+A 的形式(k +1个 A,k 个 B,均可为空串) 分析 官方题解 对于前缀P,我们可以把它拆成P=SSSS…SSSST,其中T是S的前缀.显然可以用KMP算法,时间复杂度是O(n). 当T=S:P=SSS…S.假设S出现了R次.如果转换为ABABAB…ABABA的形式,A和B是由几个S组成,而且最

Codeforces 526D Om Nom and Necklace kmp+hash

题目链接:点击打开链接 题意: 给出长度为n的字符串,常数k 下面一个长度为n的字符串. 问: for(int i = 1; i <= n; i++){ 字符串的前i个字符 能否构成 形如A+B+A+B+A+B+A的形式,其中A有k+1个,B有k个 A和B是2个任意的字符串(也可以为空串) 若可以构成则输出1,否则输出0 } 思路: POJ1961 先用kmp求一个前缀循环节,. 我们观察 ABABABA => AB, AB, AB, A 所以前缀循环节有K个,而后面的A是尽可能地和AB长度接

Codeforces C - Om Nom and Candies

C - Om Nom and Candies 思路:贪心+思维(或者叫数学).假设最大值max(wr,wb)为wr,当c/wr小于√c时,可以枚举r糖的数量(从0到c/wr),更新答案,复杂度√c:否则,假设hr/wr<hb/wr,得到hr*wb<hb*wr,由这个等式可知,在有wb*wr重量限制的情况下,买wb个r糖没有买wr个b糖划算,当需要买超过wb个r糖时,不如去买b糖,可以枚举r糖的数量(从0到wb-1),更新答案,复杂度√c. 代码: #include<bits/stdc++

Codeforces 526C - Om Nom and Candies

A sweet little monster Om Nom loves candies very much. One day he found himself in a rather tricky situation that required him to think a bit in order to enjoy candies the most. Would you succeed with the same task if you were on his place? One day,

ZeptoLab Code Rush 2015 B. Om Nom and Dark Park DFS

B. Om Nom and Dark Park Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/526/problem/B Description Om Nom is the main character of a game "Cut the Rope". He is a bright little monster who likes visiting friends living a

ZeptoLab Code Rush 2015 C. Om Nom and Candies 暴力

C. Om Nom and Candies Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/526/problem/C Description A sweet little monster Om Nom loves candies very much. One day he found himself in a rather tricky situation that required him

B. Om Nom and Dark Park

B. Om Nom and Dark Park 在满二叉树上的某些边上添加一些值.使得根节点到叶子节点的路径上的权值和都相等.求最少需要添加多少. 我们利用性质解题.   考察兄弟节点.由于他们从跟节点到父节点这路径是相同的,所以需要添加的值为  2*max(lch,rch)-lch-rch;  同时将max(lch,rch)累加到父节点. 思路是最重要的.有时候不是聪不聪明的问题,而是会不会思考的问题. 1 #include <iostream> 2 #include <cstdio&

C. Om Nom and Candies 巧妙优化枚举,将复杂度控制在10e6

C. Om Nom and Candies 无线超大背包问题 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <algorithm> 6 #include <string> 7 #include <vector> 8 #include <set> 9 #include <