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;
    } 
    

      

    有关后缀数组的讲解

  • 相关阅读:
    软件工程课程总结
    c#代码分析
    运用visual studio进行简单的单元测试
    安装visual studio过程
    忙着,快乐着
    软件工程心得
    session
    XML
    期末团队评价
    黄金点游戏
  • 原文地址:https://www.cnblogs.com/zhenghaotian/p/6973077.html
Copyright © 2011-2022 走看看