spoj705(sa

来源:互联网 发布:java swing 日历控件 编辑:程序博客网 时间:2024/04/29 21:19
/* *Author:       Zhaofa Fang *Created time: 2013-04-21-21.19 *Language:     C++ */#include <cstdio>#include <cstdlib>#include <sstream>#include <iostream>#include <cmath>#include <cstring>#include <algorithm>#include <string>#include <utility>#include <vector>#include <queue>#include <map>#include <set>using namespace std;typedef long long ll;#define DEBUG(x) cout<< #x << ':' << x << endl#define FOR(i,s,t) for(int i = (s);i <= (t);i++)#define FORD(i,s,t) for(int i = (s);i >= (t);i--)#define REP(i,n) FOR(i,0,n-1)#define REPD(i,n) FORD(i,n-1,0)#define PII pair<int,int>#define PB push_back#define MP make_pair#define ft first#define sd second#define lowbit(x) (x&(-x))#define INF (1<<30)const int maxn = 1111;char s[maxn];int sa[maxn],t1[maxn],t2[maxn],c[maxn];int rank[maxn],height[maxn];void getHeight(int n){    int k = 0;    for(int i=1;i<=n;i++)rank[sa[i]] = i;    for(int i=0;i<n;i++){        if(k)k--;        int j = sa[rank[i]-1];        while(s[i+k]==s[j+k])k++;        height[rank[i]] = k;    }}bool cmp(int *r,int a,int b,int l){    return (r[a]==r[b] && r[a+l]==r[b+l]);}void build_sa(int m,int n){    int i,*x=t1,*y=t2,k,p;    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(k=1,p=0;p<n;m=p,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];        swap(x,y);        p = 1; x[sa[0]] = 0;        for(i=1;i<n;i++)            x[sa[i]] = cmp(y,sa[i-1],sa[i],k)?p-1:p++;    }    getHeight(n-1);}int solve(int n){    int ans = n - sa[1];    for(int i=2;i<=n;i++){        ans += n-sa[i]-height[i];    }    return ans;}int main(){    //freopen("in","r",stdin);    //freopen("out","w",stdout);    int T;    cin>>T;    while(T--){        scanf("%s",s);        int n = strlen(s);        build_sa(255,n+1);        printf("%d\n",solve(n));    }    return 0;}

0 0
原创粉丝点击