Codeforces 526D Om Nom and Necklace 迴圈節 kmp
阿新 • • 發佈:2019-02-13
題目連結
題意
給定一個串
思路
能否被表示為
另外還有一種特殊情況,就是
能否恰好被表示為
// 其實想到第一步就
於是求出 ∗cir
要滿足題意,則要求
那麼就可以直接根據
演算法複雜度
Code
#include <bits/stdc++.h>
#define maxn 1000010
using namespace std;
int f[maxn], n, k;
char s[maxn];
typedef long long LL;
void getfail() {
f[0] = f[1] = 0;
for (int i = 1; i < n; ++i) {
int j = f[i];
while (j && s[i] != s[j]) j = f[j];
f[i+1] = s[i] == s[j] ? j+1 : 0;
}
}
bool check(int l, int cir) {
int upp = l / k, down = l / (k+1) + 1;
upp = upp / cir, down = ceil(1.0 * down / cir);
return upp >= down || (l % (k+1 ) == 0 && (l / (k+1)) % cir == 0);
}
void work() {
scanf("%s", s);
getfail();
for (int i = 1; i <= n; ++i) {
int mincir = i - f[i], cir = mincir;
printf("%d", check(i, cir));
}
printf("\n");
}
int main() {
while (scanf("%d%d", &n, &k) != EOF) work();
return 0;
}