您的位置:首页 > 其它

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: