您的位置:首页 > 其它

HDU-5769-Substring(后缀数组)

2016-08-01 15:36 141 查看
链接:http://acm.hdu.edu.cn/showproblem.php?pid=5769

题意:给定字符串str  ('a'-'z')和字符c,问str中包含c的不重复字串有多少。

题解:



CODE:

#include <bits/stdc++.h>
using namespace std;
#define bug cout<<"bug"<<endl
#define INF 0x3f3f3f3f
#define mod 1000000007
const int MAXN = 1e5+7;
int t1[MAXN],t2[MAXN],c[MAXN];
int sa[MAXN],ra[MAXN],height[MAXN];
char st[MAXN],s[MAXN];
int num[MAXN];
bool cmp(int *r, int a, int b,int l)
{
return r[a]==r[b]&&r[a+l]==r[b+l];
}
void DA(int str[], int n, int m)
{
n++;
int i,j,p,*x=t1,*y=t2;
for(i=0; i<m; ++i)c[i]=0;
for(i=0; i<n; ++i)c[x[i]=str[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(j=1; j<=n; j<<=1)
{
p=0;
for(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<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],j)?p-1:p++;
m=p;
}
int k=0;
n--;
for(i=0; i<=n; ++i)ra[sa[i]]=i;
for(i=0; i<n; ++i)
{
if(k)--k;
j=sa[ra[i]-1];
while(str[i+k]==str[j+k])k++;
height[ra[i]]=k;
}
}
int nxt[MAXN];
int main()
{
int T,cas=1;
scanf("%d",&T);
while(T--)
{
scanf("%s",s);
scanf("%s",st);
int len = strlen(st);
for(int i=0; i<len; ++i)
num[i]=st[i]-'a'+1;
num[len]=0;
DA(num,len,30);
int poi=len;
for(int i=len-1; i>=0; --i)
{
if(st[i]==s[0])poi=i;
nxt[i]=poi;
}
long long ans=0;
for(int i=1; i<=len; ++i)
ans=ans+(len-max(nxt[sa[i]],sa[i]+height[i]));
printf("Case #%d: %I64d\n",cas++,ans);
}
return 0;
}
/*
a
abaca
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: