spoj 694. Distinct Substrings(后缀数组)
2014-02-12 14:34
232 查看
题意:给出一个串,求串中不同子串的个数。
思路:利用后缀数组的height数组,按照sa[1],sa[2],……,sa
顺序计算,第i个串会使答案增加n-sa[i]-height[i]。
题目链接:http://www.spoj.com/problems/DISUBSTR/
代码:
思路:利用后缀数组的height数组,按照sa[1],sa[2],……,sa
顺序计算,第i个串会使答案增加n-sa[i]-height[i]。
题目链接:http://www.spoj.com/problems/DISUBSTR/
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<algorithm> #include<map> #include<queue> #include<set> #include<stack> #include<cmath> #include<vector> #define inf 0x3f3f3f3f #define Inf 0x3FFFFFFFFFFFFFFFLL #define eps 1e-9 #define pi acos(-1.0) using namespace std; typedef long long ll; const int maxn=1000+10; char s[maxn]; int sa[maxn],t[maxn],t2[maxn],c[maxn]; int height[maxn],rank[maxn]; void build_sa(int n,int m) { int i,*x=t,*y=t2; for(i=0;i<m;++i) c[i]=0; for(i=0;i<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(int k=1;k<=n;k<<=1) { int 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]; swap(x,y); p=1;x[sa[0]]=0; for(i=1;i<n;++i) x[sa[i]]=(y[sa[i]]==y[sa[i-1]]&&y[sa[i]+k]==y[sa[i-1]+k])?p-1:p++; if(p>=n) break; m=p; } } void getHeight(int n) { int i,j,k=0; for(i=0;i<=n;++i) rank[sa[i]]=i; for(i=0;i<n;++i) { if(k) k--; j=sa[rank[i]-1]; while(s[i+k]==s[j+k]) k++; height[rank[i]]=k; } } int main() { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); int t,n; scanf("%d",&t); while(t--) { scanf("%s",s); n=strlen(s); build_sa(n+1,300); getHeight(n); int sum=0; for(int i=1;i<=n;++i) sum+=(n-sa[i]-height[i]); printf("%d\n",sum); } return 0; }
相关文章推荐
- SPOJ 220 Relevant Phrases of Annihilation(后缀数组)
- 后缀数组(每个字符串至少出现两次且不重叠的最长子串)spoj220
- SPOJ 220. Relevant Phrases of Annihilation(后缀数组多次不重叠子串)
- SPOJ 705 Distinct Substrings(后缀数组)
- SPOJ 694/705 后缀数组
- Spoj 694 Distinct Substrings(后缀数组)
- 【SPOJ】Distinct Substrings/New Distinct Substrings(后缀数组)
- SPOJ 694. Distinct Substrings (不相同的子串的个数--后缀数组)
- SPOJ 694 (后缀数组) Distinct Substrings
- spoj694/705 Distinct Substrings - 后缀数组
- SPOJ-694-求字符串中不同子串个数(后缀数组)
- spoj 694 Distinct Substrings 后缀数组
- spoj694 不相同的子串的个数(后缀数组)
- C - Distinct Substrings SPOJ - DISUBSTR (后缀数组)
- SPOJ 694 Distinct Substrings(后缀数组)
- 【SPOJ】Distinct Substrings/New Distinct Substrings(后缀数组)
- spoj 694 不相同的字串的个数 对后缀数组又了解了一些
- spoj 694 & spoj 705 Distinct Substrings (不同字串的个数 后缀数组)
- SPOJ694--- DISUBSTR - Distinct Substrings(后缀数组)
- SPOJ Distinct Substrings 后缀数组