//不怕别人比你聪明,就怕别人比你聪明还比你努力 #include<iostream> #include<string> #include<algorithm> #include<cstdio> #include<cstring> #include<cmath> #include<set> #include<stack> #include<map> #include<vector> #include<iterator> #define INF 0x3f3f3f3f #define ll long long
usingnamespacestd; constint MAXN = 500; int n,w; char str[MAXN]; int SA[MAXN]; int buc[MAXN]; int x[MAXN],y[MAXN],len; int rank[MAXN],height[MAXN];///rank[i] 用来记录后缀 i 在 SA 数组的位置,表示字符串i的排名 ///height[i] 记录后缀 SA[i] 和 SA[i - 1] 的 LCP 的长度。 int h[MAXN]; //h[i] = height[rank[i]]:排名为i的后缀与排名靠前一位的最长公共前缀
//rank:这个排在第几,SA:排在第几的是谁 voidda() { scanf("%s",str); len = strlen(str); int m = 127; for(int i= 0 ;i < m;i ++) buc[i] = 0; for(int i = 0;i < len;i ++) buc[x[i] = str[i]] ++; for(int i = 1 ;i < m;i ++) buc[i] += buc[i-1]; for(int i = len -1;i >= 0;i --) SA[-- buc[x[i]]] = i; for(int k = 1;k <= len;k <<= 1) { int p = 0; for(int i = len- 1;i >= len - k;i --) y[p++] = i; for(int i =0 ;i < len;i ++) if(SA[i] >= k) y[p++] = SA[i] - k;