Lang:G++
Edit12345678910111213141516171819202122232425262728293031#include<iostream>#include<cstdio>#include<cstring>#include<vector>using namespace std;const int nMax = 300001;char arr[nMax+1];char str1[nMax];char str2[nMax];int sa[nMax], rk[nMax], height[nMax];int wa[nMax], wb[nMax], wv[nMax], wd[nMax];int cmp(int *r, int a, int b, int l){return r[a] == r[b] && r[a+l] == r[b+l];}void da(char *r, int n, int m){ // 倍增算法 r为待匹配数组 n为总长度 m为字符范围int i, j, p, *x = wa, *y = wb, *t;for(i = 0; i < m; i ++) wd[i] = 0;for(i = 0; i < n; i ++) wd[x[i]=r[i]] ++;for(i = 1; i < m; i ++) wd[i] += wd[i-1];for(i = n-1; i >= 0; i --) sa[-- wd[x[i]]] = i;for(j = 1, p = 1; p < n; j *= 2, m = p){for(p = 0, i = n-j; i < n; i ++) y[p ++] = i;for(i = 0; i < n; i ++) if(sa[i] >= j) y[p ++] = sa[i] - j;for(i = 0; i < n; i ++) wv[i] = x[y[i]];for(i = 0; i < m; i ++) wd[i] = 0;for(i = 0; i < n; i ++) wd[wv[i]] ++;for(i = 1; i < m; i ++) wd[i] += wd[i-1];for(i = n-1; i >= 0; i --) sa[-- wd[wv[i]]] = y[i];