字尾陣列 POJ 2217 Secretary

2022-05-21 09:26:50 字數 834 閱讀 9355

題目鏈結

題意:求兩個字串的最長公共子串

分析:做法是構造新的串是兩個串連線而成,中間用沒有出現的字元隔開(因為這樣才能保證s的字尾的公共字首不會跨出乙個原有串的範圍),即news = s + '$' + t。對其求sa陣列和height陣列,取最小值的height[i],且兩個字尾串屬於不同的字串。

#include #include #include #include #include typedef long long ll;

const int n = 1e4 + 5;

std::string t, str;

int sa[n<<1], rank[n<<1];

int height[n<<1];

int tmp[n<<1];

int n, k;

bool cmp_sa(int i, int j) else

}void get_sa(std::string s, int *sa)

for (k=1; k<=n; k<<=1)

for (int i=0; i<=n; ++i)

}}void get_height(std::string s, int *sa, int *height)

for (; j+h}

height[rank[i]-1] = h;

}}int run(int len1, std::string s)

}return ret;

}int main()

return 0;

}

POJ 2217 Secretary 字尾陣列

題目大意 計算兩個字串的最長的公共字串字串的長度。思路分析 將兩個串合併起來。然後直接跑字尾陣列求出height 然後就可以直接掃瞄一次height 加個是不是在乙個串中的判斷就可以了。include include include include define maxn 200005 using ...

POJ 2217 字尾陣列 最長公共子串

題目鏈結 題目大意 求兩個串的最長公共子串,注意子串是連續的,而子串行可以不連續。解題思路 字尾陣列解法是這類問題的模板解法。對於n個串的最長公共子串,這要把這些串連在一起,中間用 這類的特殊符號分隔一下。先求字尾陣列,再求最長公共字首,取相鄰兩個且屬於不同串的sa的最大lcp即可。原理就是 這樣把...

poj 3294 字尾陣列

題意 給定n個串,求最長的子串s,使得s為其中超過一半的串的公共子串。題解 字尾陣列,按height陣列分組,按sa陣列輸出。include include include using namespace std const int maxn 200000 int s maxn w maxn wa ...