SPOJ DISUBSTR Distinct Substrings(后缀数组)
2017-11-08 21:43
537 查看
题意:
一个字符串有多少个不同的字串思路:
一个字符串共有n∗(n+1)2个,减去所有的height数组的值,就是减去了所有重复的子串错误及反思:
代码:
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N = 1010; char arr ; int sa ,rak ,height ; void construct(const char *s,int n,int m) { static int t1 ,t2 ,c ; int *x = t1,*y = t2; int i,j,k,p,l; memset(c,0,sizeof(c)); for (i = 0; i < a813 n; ++ i) c[x[i] = s[i]] ++; for (i = 1; i < m; ++ i) c[i] += c[i - 1]; for (i = n - 1; i >= 0; -- i) sa[--c[x[i]]] = i; for (k = 1; k <= n; k <<= 1) { p = 0; for (i = n - k; i < n; ++ i) y[p++] = i; for (i = 0; i < n; ++ i) if (sa[i] >= k) y[p++] = sa[i] - k; for (i = 0; i < m; ++ i) c[i] = 0; for (i = 0; i < n; ++ i) c[x[y[i]]] ++; for (i = 1; i < m; ++ i) c[i] += c[i - 1]; for (i = n - 1; i >= 0; -- i) sa[--c[x[y[i]]]] = y[i]; std::swap(x,y); p = 1; x[sa[0]] = 0; for (i = 1; i < n; ++ i) x[sa[i]] = y[sa[i - 1]] == y[sa[i]] && y[sa[i - 1] + k] == y[sa[i] + k] ? p - 1: p ++; if (p >= n) break; m = p; } for (i = 0; i < n; ++ i) rak[sa[i]] = i; for (i = 0,l = 0; i < n; ++ i) { if (rak[i]) { j = sa[rak[i] - 1]; while (s[i + l] == s[j + l]) l++; height[rak[i]] = l; if (l) l--; } } } int main() { int t; scanf("%d",&t); while(t--) { scanf("%s",arr); int len=strlen(arr); construct(arr,len+1,128); int ans=len*(len+1)/2; for(int i=2;i<=len;i++) { ans-=height[i]; } printf("%d\n",ans); } }
相关文章推荐
- SPOJ694&&SPOJ705 DISUBSTR - Distinct Substrings && SUBST1 - New Distinct Substrings 后缀数组
- C - Distinct Substrings SPOJ - DISUBSTR (后缀数组)
- Distinct Substrings SPOJ - DISUBSTR 后缀数组(计算不同的子串数目)
- SPOJ DISUBSTR Distinct Substrings 后缀数组子串个数
- SPOJ DISUBSTR - Distinct Substrings or SUBST1 - New Distinct Substrings 【不同子串数目】
- SPOJ DISUBSTR Distinct Substrings
- SPOJ 694 / SPOJ DISUBSTR Distinct Substrings【后缀数组】不相同的子串的个数
- Distinct Substrings SPOJ - DISUBSTR
- SPOJ - DISUBSTR Distinct Substrings(后缀数组求不相同的子串个数)
- SPOJ 694 DISUBSTR Distinct Substrings 后缀数组
- SPOJ - DISUBSTR Distinct Substrings
- SPOJ DISUBSTR Distinct Substrings
- SPOJ DISUBSTR Distinct Substrings
- SPOJ DISUBSTR(后缀数组)
- SPOJ SUBST1 - New Distinct Substrings (后缀数组)
- SPOJ - SUBST1 New Distinct Substrings 后缀数组
- SPOJ 705 New DistinctSubstrings (后缀数组)
- SPOJ Distinct Substrings 后缀数组
- [SPOJ705]DISUBSTR - Distinct Substrings(后缀数组)
- SPOJ DISUBSTR 后缀数组