bzoj1692 后缀数组模板
2017-09-21 06:42
375 查看
#include<iostream> #include<algorithm> #include<cstdio> #include<string.h> using namespace std; char str1[60002]; int buc[60002], rk[60002], y[60002], sa[60002]; char ans[60002]; int n; int showw, showww, showwww; void getsa(char *s, int len) { int m = len >= 300 ? len : 300; for (int i = 0; i <= m; i++)buc[i] = 0; for (int i = 1; i <= len; i++)buc[rk[i] = s[i]]++; for (int i = 1; i <= m; i++)buc[i] += buc[i - 1]; for (int i = len; i >= 1; i--)sa[buc[rk[i]]--]= i; for (int k = 1; k <= len; k <<= 1) { int p = 1; for (int i = len; i >= len - k + 1; i--)y[p++] = i; for (int i = 1; i <= len; i++)if (sa[i] > k)y[p++] = sa[i] - k; for (int i = 0; i <= m; i++)buc[i] = 0; for (int i = 1; i < p; i++)buc[rk[y[i]]]++; for (int i = 1; i <= m; i++)buc[i] += buc[i - 1]; for (int i = p - 1; i >= 1; i--)sa[buc[rk[y[i]]]--] = y[i]; swap(rk, y); rk[sa[1]] = 1; int q = 2; for (int i = 2; i <= len; i++) { if (y[sa[i]] == y[sa[i - 1]] && y[sa[i] + k] == y[sa[i - 1] + k]) rk[sa[i]] = q - 1; else rk[sa[i]] = q++; } m = q; if (q > len)break; } } int change(int l) { return 2 * (n + 1) - l; } int main() { scanf("%d", &n); char cc; while ((cc=getchar()) == '\n'); for (int i = 1; i <=n; i++) { str1[i] = cc; //str1[i] = 'A'; while (i!=n&&(cc = getchar()) == '\n'); } str1[n + 1] = 'A' - 1; for (int i = n, k = n + 2; i >= 1; k++, i--)str1[k] = str1[i]; int len = strlen(str1+1); getsa(str1, len); int l = 1; int r = n; int num = 0; while (l != r) { if (str1[l] == str1[r]) { if (rk[l] < rk[change(r)])ans[num++] = str1[l++]; else ans[num++] = str1[r--]; } else { if (str1[l] < str1[r]) ans[num++] = str1[l++]; else ans[num++] = str1[r--]; } } ans[num] = str1[l]; for (int i = 0,k=1; i <= num; i++,k++) { printf("%c", ans[i]); if (k % 80 == 0)printf("\n"); } printf("\n"); return 0; }
相关文章推荐
- bzoj 4278: [ONTAK2015]Tasowanie&bzoj 1692: [Usaco2007 Dec]队列变换 后缀数组+贪心
- BZOJ 1692 [Usaco2007 Dec]队列变换 暴力(正解后缀数组)
- bzoj1692 [Usaco2007 Dec]队列变换 后缀数组+贪心
- BZOJ_1692_[Usaco2007 Dec]队列变换_后缀数组
- bzoj1692 [Usaco2007 Dec]队列变换(后缀数组)
- bzoj 1640||1692: [Usaco2007 Dec]队列变换【后缀数组】
- 【BZOJ】1692 & 1640: [Usaco2007 Dec]队列变换(后缀数组+贪心)
- 后缀数组练习题bzoj 1031 后缀数组模板题目
- BZOJ 1692 队列变换 贪心+后缀数组
- BZOJ 1692: [Usaco2007 Dec]队列变换 [后缀数组 贪心]
- 【bzoj1692】【队列变幻】【贪心+后缀数组】
- 【BZOJ1692】[Usaco2007 Dec]队列变换 后缀数组+贪心
- 【BZOJ1692】[Usaco2007 Dec]队列变换【后缀数组】【贪心】
- [BZOJ 1692] [Usaco2007 Dec] 队列变换 【后缀数组 + 贪心】
- bzoj 1640 && bzoj 1692: [Usaco2007 Dec]队列变换(后缀数组)
- BZOJ 2119: 股市的预测 [后缀数组 ST表]
- BZOJ 4278 ONTAK2015 Tasowanie 后缀数组
- 后缀数组-倍增算法模板
- BZOJ 1031 字符加密【后缀数组】
- [bzoj2946][后缀数组][Poi2000]公共串