提交记录 5438


用户 题目 状态 得分 用时 内存 语言 代码长度
Moon 1006. 【模板题】后缀排序 Compile Error 0 0 ns 0 KB C++ 2.87 KB
提交时间 评测时间
2018-08-22 21:19:59 2020-08-01 00:17:08
/*
    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);

}

CompilationN/AN/ACompile ErrorScore: N/A


Judge Duck Online | 评测鸭在线
Server Time: 2026-04-11 21:05:09 | Loaded in 1 ms | Server Status
个人娱乐项目,仅供学习交流使用 | 捐赠