題目鏈結
題意:求兩個字串的最長公共子串
分析:做法是構造新的串是兩個串連線而成,中間用沒有出現的字元隔開(因為這樣才能保證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 ...