我们定义一个二进制字符串 z 的美感值为满足 1≤i<∣z∣ 且 zi=zi+1 的索引 i 的数量。
在等待 CCB 的朋友们到来时,Andryusha 烤了一个馅饼,表示为一个长度为 n 的二进制字符串 s。为了避免冒犯任何人,他想要将这个字符串分割成 k 个子字符串,使得每个字符属于恰好一个子字符串,且所有子字符串的美感值相同。
Andryusha 不知道会有多少 CCB 的朋友来他家,因此他希望找出满足条件的所有 k 值的数量。然而,他的兄弟 Tristan 认为这个问题的表述过于简单。因此,他要求你为字符串的每个前缀找出这样的 k 值的数量。换句话说,对于每个 i(从 1 到 n),你需要找出满足可以将前缀 s1s2…si 分割成恰好 k 个具有相同美感值的子字符串的 k 值的数量。
int n, m; int a[kMaxN], ans[kMaxN], pos[kMaxN]; std::string str;
voiddickdreamer(){ std::cin >> n >> str; str = " " + str, m = 0; std::fill_n(ans + 1, n, 0); for (int i = 1, lst = 0; i <= n; ++i) { if (i == n || str[i] != str[i + 1]) { a[++m] = i - lst; for (int j = lst + 1; j <= i; ++j) pos[j] = m; lst = i; } } for (int i = 1; i <= n - 1; ++i) { int l = i + 1, r = i + 1; for (; l <= n;) { ++ans[l], --ans[std::min(r, n) + 1]; r += i + 1; if (a[l] == 1) l += i + 1; else l += i; } } for (int i = 1; i <= m; ++i) ans[i] += ans[i - 1]; for (int i = 1; i <= n; ++i) { std::cout << ans[pos[i]] + i - pos[i] + 1 << " \n"[i == n]; } }