fork download
  1. // ~~ icebear ~~
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4.  
  5. typedef long long ll;
  6. typedef pair<int, int> ii;
  7. typedef pair<int, ii> iii;
  8.  
  9. template<class T>
  10. bool minimize(T &a, const T &b) {
  11. if (a > b) return a = b, true;
  12. return false;
  13. }
  14.  
  15. template<class T>
  16. bool maximize(T &a, const T &b) {
  17. if (a < b) return a = b, true;
  18. return false;
  19. }
  20.  
  21. #define FOR(i,a,b) for(int i=(a); i<=(b); ++i)
  22. #define FORR(i,a,b) for(int i=(a); i>=(b); --i)
  23. #define REP(i, n) for(int i=0; i<(n); ++i)
  24. #define RED(i, n) for(int i=(n)-1; i>=0; --i)
  25. #define MASK(i) (1LL << (i))
  26. #define BIT(S, i) (((S) >> (i)) & 1)
  27. #define mp make_pair
  28. #define pb push_back
  29. #define fi first
  30. #define se second
  31. #define all(x) x.begin(), x.end()
  32. #define task "kstring"
  33.  
  34. const int MOD = 1e9 + 2277;
  35. const int inf = 1e9 + 27092008;
  36. const ll INF = 1e18 + 27092008;
  37. const int N = 50000 + 5;
  38. const int base = 311;
  39. struct Suffix_Array {
  40. const static int SIZE = 256;
  41. int p[N], c[N], pn[N], cn[N], cnt[N], tempClass[20][N], pos[N], rmq[N][20];
  42. string s;
  43. int n, classes;
  44.  
  45. Suffix_Array() {
  46. n = 0;
  47. s = "";
  48. }
  49.  
  50. void assignment(string _s) {
  51. s = _s;
  52. n = (int)_s.size();
  53. memset(cnt, 0, sizeof cnt);
  54. }
  55.  
  56. void prepare() {
  57. for(char c : s) cnt[c]++;
  58. FOR(i, 1, SIZE) cnt[i] += cnt[i - 1];
  59. REP(i, n) p[--cnt[s[i]]] = i;
  60. classes = c[p[0]] = 0;
  61. FOR(i, 1, n - 1) {
  62. if (s[p[i]] != s[p[i - 1]])
  63. classes++;
  64. c[p[i]] = classes;
  65. }
  66. }
  67.  
  68. void build_SA() {
  69. REP(h, 20) if (MASK(h) < n) {
  70. REP(i, n) tempClass[h][i] = c[i];
  71. REP(i, n) {
  72. pn[i] = p[i] - MASK(h);
  73. if (pn[i] < 0) pn[i] += n;
  74. }
  75. fill(cnt, cnt + classes + 1, 0);
  76. REP(i, n) cnt[c[pn[i]]]++;
  77. FOR(i, 1, classes) cnt[i] += cnt[i - 1];
  78.  
  79. RED(i, n) {
  80. int cur_class = c[pn[i]];
  81. p[--cnt[cur_class]] = pn[i];
  82. }
  83. cn[p[0]] = classes = 0;
  84. FOR(i, 1, n - 1) {
  85. ii cur = mp(c[p[i]], c[(p[i] + MASK(h)) % n]);
  86. ii pre = mp(c[p[i - 1]], c[(p[i - 1] + MASK(h)) % n]);
  87. if (cur != pre) classes++;
  88. cn[p[i]] = classes;
  89. }
  90.  
  91. REP(i, n) c[i] = cn[i];
  92. }
  93. }
  94.  
  95. int LCP(int i, int j) {
  96. int ans = 0;
  97. RED(h, 20) if (MASK(h) < n && tempClass[h][i % n] == tempClass[h][j % n]) {
  98. ans += MASK(h);
  99. i += MASK(h);
  100. j += MASK(h);
  101. }
  102. return ans;
  103. }
  104.  
  105. void build_SuffixArray(string s) {
  106. assignment(s);
  107. prepare();
  108. build_SA();
  109. REP(i, n) pos[p[i]] = i;
  110. REP(i, n - 1) rmq[i][0] = LCP(p[i], p[i + 1]);
  111. FOR(j, 1, 19) for(int i = 0; i < n - MASK(j); i++)
  112. rmq[i][j] = min(rmq[i][j - 1], rmq[i + MASK(j - 1)][j - 1]);
  113. }
  114.  
  115. int lcp(int i, int j) {
  116. if (i == j) return n;
  117. i = pos[i-1]; j = pos[j-1];
  118. if (i > j) swap(i, j);
  119. j--;
  120. int k = __lg(j - i + 1);
  121. return min(rmq[i][k], rmq[j - MASK(k) + 1][k]);
  122. }
  123. } SA;
  124.  
  125. int n, d;
  126. string s;
  127. int hsh[N], power[N];
  128. vector<long long> newHash[N];
  129.  
  130. int getHash(int l, int r) {
  131. if (l > r) return 0;
  132. return (hsh[r] - 1LL * hsh[l - 1] * power[r - l + 1] % MOD + MOD) % MOD;
  133. }
  134.  
  135. long long eraseHash(int pos, int l, int r) {
  136. int hashLeft = getHash(l, pos - 1);
  137. int hashRight = getHash(pos + 1, r);
  138. long long finalHsh = (1LL * hashLeft * power[r - pos] + hashRight);
  139. return finalHsh;
  140. }
  141.  
  142. void init(void) {
  143. cin >> n >> d >> s;
  144. SA.build_SuffixArray(s + "#");
  145. s = " " + s;
  146. power[0] = 1;
  147. FOR(i, 1, n) {
  148. power[i] = 1LL * power[i - 1] * base % MOD;
  149. hsh[i] = (1LL * hsh[i - 1] * base + s[i]) % MOD;
  150. }
  151. }
  152.  
  153. void process(void) {
  154. if (d == 0) {
  155. map<int, int> cnt;
  156. FOR(k, 1, n) {
  157. cnt.clear();
  158. for(int i = k; i <= n; i += k) cnt[getHash(i - k + 1, i)]++;
  159. ll ans = 0;
  160. for(auto x : cnt) ans += 1LL * x.se * (x.se - 1) / 2;
  161. cout << ans << ' ';
  162. }
  163. } else {
  164. int S = min(100, n);
  165. FOR(k, 1, S) {
  166. ll ans = 0;
  167. FOR(i, 0, k) newHash[i].clear();
  168. FOR(i, 1, n / k) {
  169. int l = (i - 1) * k + 1;
  170. int r = i * k;
  171. newHash[0].push_back(getHash(l, r));
  172. FOR(j, l, r) newHash[j - l + 1].push_back(eraseHash(j, l, r));
  173. }
  174. ll countSame = 0;
  175. FOR(i, 0, k) {
  176. sort(all(newHash[i]));
  177. int cnt = 1;
  178. FOR(j, 1, (int)newHash[i].size() - 1) {
  179. if (newHash[i][j] == newHash[i][j - 1]) {
  180. if (i == 0) countSame += cnt++;
  181. else ans += cnt++;
  182. } else cnt = 1;
  183. }
  184. }
  185. ans -= 1LL * countSame * (k - 1);
  186. cout << ans << ' ';
  187. }
  188.  
  189. FOR(k, S + 1, n) {
  190. int m = n / k;
  191. ll ans = 0;
  192. FOR(i, 1, m) FOR(j, i + 1, m) {
  193. int l = (i - 1) * k + 1;
  194. int u = (j - 1) * k + 1;
  195.  
  196. int same = SA.lcp(l, u);
  197. if (same >= k) ans++;
  198. else if (SA.lcp(l + same + 1, u + same + 1) >= k - same - 1) ans++;
  199. }
  200. cout << ans << ' ';
  201. }
  202. }
  203. }
  204.  
  205. int main() {
  206. ios_base::sync_with_stdio(0);
  207. cin.tie(0); cout.tie(0);
  208. if (fopen(task".inp", "r")) {
  209. freopen(task".inp", "r", stdin);
  210. freopen(task".out", "w", stdout);
  211. }
  212. int tc = 1;
  213. // cin >> tc;
  214. while(tc--) {
  215. init();
  216. process();
  217. }
  218. return 0;
  219. }
  220.  
Success #stdin #stdout 0.01s 8344KB
stdin
Standard input is empty
stdout
Standard output is empty