程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> POJ 2774 後綴數組:求最長公共子串

POJ 2774 後綴數組:求最長公共子串

編輯:C++入門知識

POJ 2774 後綴數組:求最長公共子串


思路:其實很簡單,就是兩個字符串連接起來,中間用個特殊字符隔開,然後用後綴數組求最長公共前綴,然後不同在兩個串中,並且最長的就是最長公共子串了。

注意的是:用第一個字符串來判斷是不是在同一個字符中,剛開始用了第二個字符的長度來判斷WA了2發才發現。

#include
#include
#include
#include
#include
#include
#include
#include
#include
#define mem(a,b) memset(a,b,sizeof(a))
#define lson i<<1,l,mid
#define rson i<<1|1,mid+1,r
#define llson j<<1,l,mid
#define rrson j<<1|1,mid+1,r
#define INF 0x7fffffff
#define maxn 200010
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
void radix(int *str,int *a,int *b,int n,int m)
{
    static int count[maxn];
    mem(count,0);
    for(int i=0; i=0; i--) b[--count[str[a[i]]]]=a[i];
}
void suffix(int *str,int *sa,int n,int m) //倍增算法計算出後綴數組sa
{
    static int rank[maxn],a[maxn],b[maxn];
    for(int i=0; i=n?0:rank[j+(1<>s>>ss)
    {
        ss=s+"#"+ss;
        copy(ss.begin(),ss.end(),a);
        int n=ss.size(),len=0;
        suffix(a,sa,n,256);
        calcHeight(a,sa,height,rank,n);
        for(int i=1; ilen&&((sa[i]

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved