zoukankan      html  css  js  c++  java
  • 后缀数组

    模板题

    蒙蔽,先背着,说不定哪天就开窍了。

    半年后,真的自己开不了窍,还是得有人讲才能明白些。

    于是我先记录一下我对于后缀数组的理解吧。

    算了还是写在代码注释中吧。。。

    我后悔了,写在代码中之后复制过来会乱码,贴张图片吧。

    ——代码

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #define N 1100001
    
    using namespace std;
    
    int n, m = 'z' + 1;
    char s[N];
    int x[N], y[N], b[N], sa[N];
    
    inline void build_sa()
    {
    	int i, k, p;
    	n = strlen(s);
    	for(i = 0; i < m; i++) b[i] = 0;
    	for(i = 0; i < n; i++) b[x[i] = s[i]]++;
    	for(i = 1; i < m; i++) b[i] += b[i - 1];
    	for(i = n - 1; i >= 0; i--) sa[--b[x[i]]] = i;
    	for(k = 1; k <= n; k <<= 1)
    	{
    		p = 0;
    		for(i = n - k; i < n; i++) y[p++] = i;
    		for(i = 0; i < n; i++) if(sa[i] >= k) y[p++] = sa[i] - k;
    		for(i = 0; i < m; i++) b[i] = 0;
    		for(i = 0; i < n; i++) b[x[y[i]]]++;
    		for(i = 1; i < m; i++) b[i] += b[i - 1];
    		for(i = n - 1; i >= 0; i--) sa[--b[x[y[i]]]] = y[i];
    		swap(x, y);
    		p = 1, x[sa[0]] = 0;
    		for(i = 1; i < n; i++)
    			x[sa[i]] = y[sa[i - 1]] == y[sa[i]] && y[sa[i - 1] + k] == y[sa[i] + k] ? p - 1 : p++;
    		if(p >= n) break; 
    		m = p;
    	}
    }
    
    int main()
    {
    	int i;
    	scanf("%s", s);
    	build_sa();
    	for(i = 0; i < n; i++) printf("%d ", sa[i] + 1);
    	return 0;
    } 
    

      

    有关后缀数组的讲解

  • 相关阅读:
    模拟+位运算 HDOJ 5491 The Next
    树状数组+二分||线段树 HDOJ 5493 Queue
    线段树(区间合并) HDOJ 3308 LCIS
    双端队列 HDOJ 3530 Subsequence
    BFS HDOJ 1242 Rescue
    Codeforces Round #321 (Div. 2)
    区间专题
    递推DP HDOJ 5459 Jesus Is Here
    补题列表2
    引用与指针的异同-基础篇
  • 原文地址:https://www.cnblogs.com/zhenghaotian/p/6973077.html
Copyright © 2011-2022 走看看