(原文有详解,若点击链接跳转失败,直接在浏览器输入 bestsort.cn 即可)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| int cnt[MAXn]; char String[MAXn]; void Manacher(char s[],int len) { int l = 0; String[l++] = '$'; String[l++] = '#'; for (int i = 0; i < len; i++) { String[l++] = s[i]; String[l++] = '#'; } String[l] = 0; int MaxR = 0; int flag = 0; for (int i = 0; i < l; i++) { cnt[i] = MaxR > i ? min(cnt[2 * flag - i], MaxR - i) : 1; while (String[i + cnt[i]] == String[i - cnt[i]]) cnt[i]++; if (i + cnt[i] > MaxR) { MaxR = i + cnt[i]; flag = i; } } }
|