Codeforces - ZeptoLab Code Rush 2015 - D. Om Nom and Necklace:字符串
2015-04-06 01:14
741 查看
D. Om Nom and Necklace
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output
One day Om Nom found a thread with n beads of different colors. He decided to cut the first several beads from this thread to make a bead necklace and present it to his girlfriend Om Nelly.
Om Nom knows that his girlfriend loves beautiful patterns. That's why he wants the beads on the necklace to form a regular pattern. A sequence of beads S is regular if it can be represented as S = A + B + A + B + A + ... + A + B + A, where A and B are some bead sequences, " + " is the concatenation of sequences, there are exactly 2k + 1 summands in this sum, among which there are k + 1 "A" summands and k "B" summands that follow in alternating order. Om Nelly knows that her friend is an eager mathematician, so she doesn't mind if A or B is an empty sequence.
Help Om Nom determine in which ways he can cut off the first several beads from the found thread (at least one; probably, all) so that they form a regular pattern. When Om Nom cuts off the beads, he doesn't change their order.
Input
The first line contains two integers n, k (1 ≤ n, k ≤ 1 000 000) — the number of beads on the thread that Om Nom found and number k from the definition of the regular sequence above.
The second line contains the sequence of n lowercase Latin letters that represent the colors of the beads. Each color corresponds to a single letter.
Output
Print a string consisting of n zeroes and ones. Position i (1 ≤ i ≤ n) must contain either number one if the first i beads on the thread form a regular sequence, or a zero otherwise.
Sample test(s)
Input
Output
Input
Output
Note
In the first sample test a regular sequence is both a sequence of the first 6 beads (we can take A = "", B = "bca"), and a sequence of the first 7 beads (we can take A = "b", B = "ca").
In the second sample test, for example, a sequence of the first 13 beads is regular, if we take A = "aba", B = "ba".
思路:可以将AB看成一个串(设为C),然后问题就等价为:判断字符串是否由k个连续的C串以及C串的一个前缀组成(前缀可以为空)。
然后用Z算法求出z数组。
然后从1到n枚举C串的长度(设为len),判断z[0],z[len],z[len*2],....,z[len*(k-1)]的值是否都不小于len,如果都符合就标记最后一个匹配位置为true。
输出的时候维护一个last指针,表示C串的前缀最多能扩展到哪个位置。
复杂度o(n).
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output
One day Om Nom found a thread with n beads of different colors. He decided to cut the first several beads from this thread to make a bead necklace and present it to his girlfriend Om Nelly.
Om Nom knows that his girlfriend loves beautiful patterns. That's why he wants the beads on the necklace to form a regular pattern. A sequence of beads S is regular if it can be represented as S = A + B + A + B + A + ... + A + B + A, where A and B are some bead sequences, " + " is the concatenation of sequences, there are exactly 2k + 1 summands in this sum, among which there are k + 1 "A" summands and k "B" summands that follow in alternating order. Om Nelly knows that her friend is an eager mathematician, so she doesn't mind if A or B is an empty sequence.
Help Om Nom determine in which ways he can cut off the first several beads from the found thread (at least one; probably, all) so that they form a regular pattern. When Om Nom cuts off the beads, he doesn't change their order.
Input
The first line contains two integers n, k (1 ≤ n, k ≤ 1 000 000) — the number of beads on the thread that Om Nom found and number k from the definition of the regular sequence above.
The second line contains the sequence of n lowercase Latin letters that represent the colors of the beads. Each color corresponds to a single letter.
Output
Print a string consisting of n zeroes and ones. Position i (1 ≤ i ≤ n) must contain either number one if the first i beads on the thread form a regular sequence, or a zero otherwise.
Sample test(s)
Input
7 2 bcabcab
Output
0000011
Input
21 2 ababaababaababaababaa
Output
000110000111111000011
Note
In the first sample test a regular sequence is both a sequence of the first 6 beads (we can take A = "", B = "bca"), and a sequence of the first 7 beads (we can take A = "b", B = "ca").
In the second sample test, for example, a sequence of the first 13 beads is regular, if we take A = "aba", B = "ba".
思路:可以将AB看成一个串(设为C),然后问题就等价为:判断字符串是否由k个连续的C串以及C串的一个前缀组成(前缀可以为空)。
然后用Z算法求出z数组。
然后从1到n枚举C串的长度(设为len),判断z[0],z[len],z[len*2],....,z[len*(k-1)]的值是否都不小于len,如果都符合就标记最后一个匹配位置为true。
输出的时候维护一个last指针,表示C串的前缀最多能扩展到哪个位置。
复杂度o(n).
#include <iostream> #include <stdio.h> using namespace std; #define MAXN 1000010 char s[MAXN]; bool ans[MAXN] = {0}; int z[MAXN] = {0}; int n, k; bool check(int len) { for(int i = 0, cnt = 0; i < n && cnt < k; i += len, cnt++) { if(z[i] < len) return false; } return true; } int main() { freopen("in.txt", "r", stdin); cin >> n >> k; scanf("%s", s); // Z[i] is the length of the longest substring starting from S[i] which is also a prefix of S // s[0,n-1] int L = 0, R = 0; for(int i = 1; i < n; i++) { if(i > R) { L = R = i; while(R < n && s[R - L] == s[R]) R++; z[i] = R - L; R--; } else { int k = i - L; if(z[k] < R - i + 1) z[i] = z[k]; else { L = i; while(R < n && s[R - L] == s[R]) R++; z[i] = R - L; R--; } } } z[0] = n; // 枚举AB串的长度 for(int len = 1; len <= n; len++) { if(len * k > n) break; // 判断长度为len的AB串是否符合 if(check(len)) { int last = len * k; ans[last - 1] = true; } } int last = -1; for(int i = 0; i < n; i++) { if(ans[i] || i<=last) printf("1"); else printf("0"); if(ans[i] && i < n - 1) { int len = (i+1)/k; last = max(last, min(i+len, i+z[i+1])); } } return 0; }
相关文章推荐
- CodeForces--ZeptoLab Code Rush 2015 (我参加的第一场cf比赛)
- ZeptoLab Code Rush 2015 C. Om Nom and Candies [ 数学 ]
- ZeptoLab Code Rush 2015 C. Om Nom and Candies 暴力
- ZeptoLab Code Rush 2015---C. Om Nom and Candies
- Codeforces ZeptoLab Code Rush 2015 B. Om Nom and Dark Park DFS
- ZeptoLab Code Rush 2015 C题Om Nom and Candies
- ZeptoLab Code Rush 2015 B. Om Nom and Dark Park
- 【codeforces】ZeptoLab Code Rush 2015 E 跳跃表? D kmp还不错的题
- ZeptoLab Code Rush 2015 C. Om Nom and Candies
- ZeptoLab Code Rush 2015_B - Om Nom and Dark Park
- C. Om Nom and Candies(ZeptoLab Code Rush 2015)
- ZeptoLab Code Rush 2015 B. Om Nom and Dark Park
- ZeptoLab Code Rush 2015 B. Om Nom and Dark Park
- 【codeforces】 ZeptoLab Code Rush 2015 A,B,C,D,E题解
- ZeptoLab Code Rush 2015 B. Om Nom and Dark Park DFS
- 【codeforces ZeptoLab Code Rush 2015】ABCD题解
- ZeptoLab Code Rush 2015
- Codeforces ZeptoLab Code Rush 2015
- ZeptoLab Code Rush 2015 -- (A,B,C)
- ZeptoLab Code Rush 2015