/*
Problem: JZOJ1598(ѯÎÊÒ»¸ö×Ö·û´®ÖÐÓжàÉÙÖÁÉÙ³öÏÖÁ½´ÎµÄ×Ó´®)
Content: SA's Code and Explanation
Author : YxuanwKeith
*/
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int BufferSize = 2180000;
char buffer[BufferSize];
char *out_tail = buffer;
const int MAXN = 100005;
inline void putint(int x)
{
if (!x)
*out_tail++ = '0';
else
{
char s_pool[6], *s_tail = s_pool;
while (x != 0)
*s_tail++ = x % 10 + '0', x /= 10;
while (s_tail-- != s_pool)
*out_tail++ = *s_tail;
}
*out_tail++ = ' ';
}
char ch[MAXN], All[MAXN];
int SA[MAXN], rank[MAXN], Height[MAXN], tax[MAXN], tp[MAXN], a[MAXN], n, m;
char str[MAXN];
//rank[i] µÚi¸öºó׺µÄÅÅÃû; SA[i] ÅÅÃûΪiµÄºó׺λÖÃ; Height[i] ÅÅÃûΪiµÄºó׺ÓëÅÅÃûΪ(i-1)µÄºó׺µÄLCP
//tax[i] ¼ÆÊýÅÅÐò¸¨ÖúÊý×é; tp[i] rankµÄ¸¨ÖúÊý×é(¼ÆÊýÅÅÐòÖеĵڶþ¹Ø¼ü×Ö),ÓëSAÒâÒåÒ»Ñù¡£
//aΪԴ®
void RSort() {
//rankµÚÒ»¹Ø¼ü×Ö,tpµÚ¶þ¹Ø¼ü×Ö¡£
for (int i = 0; i <= m; i ++) tax[i] = 0;
for (int i = 1; i <= n; i ++)tax[rank[tp[i]]] ++;
for (int i = 1; i <= m; i ++) tax[i] += tax[i-1];
for (int i = n; i >= 1; i --)
SA[tax[rank[tp[i]]] --] = tp[i]; //È·±£Âú×ãµÚÒ»¹Ø¼ü×ÖµÄͬʱ£¬ÔÙÂú×ãµÚ¶þ¹Ø¼ü×ÖµÄÒªÇó
} //¼ÆÊýÅÅÐò,°ÑеĶþÔª×éÅÅÐò¡£
int cmp(int *f, int x, int y, int w) { return f[x] == f[y] && f[x + w] == f[y + w]; }
//ͨ¹ý¶þÔª×éÁ½¸öϱêµÄ±È½Ï£¬È·¶¨Á½¸ö×Ó´®ÊÇ·ñÏàͬ
void Suffix() {
//SA
for (int i = 1; i <= n; i ++) rank[i] = a[i], tp[i] = i;
m = 127 ,RSort(); //Ò»¿ªÊ¼ÊÇÒÔµ¥¸ö×Ö·ûΪµ¥Î»£¬ËùÒÔ(m = 127)
for (int w = 1, p = 1, i; p < n; w += w, m = p) { //°Ñ×Ó´®³¤¶È·±¶,¸üÐÂrank
//w µ±Ç°Ò»¸ö×Ó´®µÄ³¤¶È; m µ±Ç°ÀëÉ¢ºóµÄÅÅÃûÖÖÀàÊý
//µ±Ç°µÄtp(µÚ¶þ¹Ø¼ü×Ö)¿ÉÖ±½ÓÓÉÉÏÒ»´ÎµÄSAµÄµÃµ½
for (p = 0, i = n - w + 1; i <= n; i ++) tp[++ p] = i; //³¤¶ÈÔ½½ç,µÚ¶þ¹Ø¼ü×ÖΪ0
for (i = 1; i <= n; i ++) if (SA[i] > w) tp[++ p] = SA[i] - w;
//¸üÐÂSAÖµ,²¢ÓÃtpÔÝʱ´æÏÂÉÏÒ»ÂÖµÄrank(ÓÃÓÚcmp±È½Ï)
RSort(), swap(rank, tp), rank[SA[1]] = p = 1;
//ÓÃÒѾÍê³ÉµÄSAÀ´¸üÐÂÓëËü»¥ÄæµÄrank,²¢ÀëÉ¢rank
for (i = 2; i <= n; i ++) rank[SA[i]] = cmp(tp, SA[i], SA[i - 1], w) ? p : ++ p;
}
//ÀëÉ¢£º°ÑÏàµÈµÄ×Ö·û´®µÄrankÉèΪÏàͬ¡£
//LCP
int j, k = 0;
for(int i = 1; i <= n; Height[rank[i ++]] = k)
for( k = k ? k - 1 : k, j = SA[rank[i] - 1]; a[i + k] == a[j + k]; ++ k);
//Õâ¸öÖªµÀÔÀíºó¾Í±È½ÏºÃÀí½â³ÌÐò
}
void Init() {
scanf("%s", str);
n = strlen(str);
for (int i = 0; i < n; i ++) a[i + 1] = str[i];
}
int main() {
Init();
Suffix();
/*int ans = Height[2];
for (int i = 3; i <= n; i ++) ans += max(Height[i] - Height[i - 1], 0);
printf("%d\n", ans); */
for (int i=1;i<=n;++i) putint(SA[i]);//printf("%d ",SA[i]);
// puts("");
*out_tail++ = '\n';
for (int i = 2; i <= n; ++i)
putint(Height[i]);
//for (int i=2;i<=n;++i) printf("%d ",Height[i]);puts("");
fwrite(buffer, 1, out_tail - buffer, stdout);
}
| Compilation | N/A | N/A | Compile Error | Score: N/A | 显示更多 |