| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
求解释 为什么会RE啊~~~~ 用后缀数组+笛卡尔树/*
一个月前,我和上帝都知道这段代码的意思;
一个月后,就只有上帝知道了。
*/
/******* Pre-treat: include *****/
#define Pre_treat_include
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/******* Pre-treat: define ******/
#define Pre_treat_define 1
#if Pre_treat_define
#define OpenFile 0
#define MAX_DATA 300000
#define MAX_LEN 300
#define MAX_ASK_DATA 100
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
#define Abs(x) (((x)>0)?(x):(-(x)))
#define GOP(x) ((x)>0?1:-1)
#endif
/********* Struct ***************/
#define Definition_Strict
struct String
{
char str[MAX_DATA];
int len;
};
struct Node
{
int l,r,p;
long long dat;
int father;
int num_a,num_b;
int num_a_l,num_b_l;
int num_a_r,num_b_r;
};
/********* Var ******************/
#define Definition_Var
struct String s;
int sa[MAX_DATA];
int rank[MAX_DATA];
int h[MAX_DATA];
int height[MAX_DATA];
int t1[MAX_DATA];
int t2[MAX_DATA];
int rank2[MAX_DATA];
int rank1[MAX_DATA];
int tt[MAX_DATA];
int tt2[MAX_DATA];
int ask[MAX_ASK_DATA][2];
int ask_n;
int LCP_ans[MAX_ASK_DATA];
//int t3[MAX_DATA];
//int t4[MAX_DATA];
struct Node descar[MAX_DATA];
int head_descar;
/********* declare **************/
#define Definition_declare
/********* Function *************/
#define Definition_Function
void Init_t()
{
int i;
for(i=0;i<MAX_DATA;i++)
{
t1[i]=0;
t2[i]=0;
}
}
void Get_Rank_f(int x)
{
int i,j;
if(x==1) /* SA1基数排序 */
{
Init_t();
for(i=1;i<=s.len+1;i++) t1[s.str[i]]++;
for(i=1;i<MAX_LEN;i++) t2[i]=t2[i-1]+t1[i-1];
for(i=1;i<=s.len+1;i++) rank[i]=t2[s.str[i]];
}
/*快排位置备份*/
else
{
for(i=1;i<=s.len;i++) /* 一,二关键字分离 */
{
rank1[i]=rank[i];
if(i+x/2<=s.len) rank2[i]=rank[i+x/2];
else rank2[i]=0;
}
Init_t(); /* 第一关键字 */
t2[0]=1;
for(i=1;i<=s.len;i++) t1[rank2[i]]++;
for(i=1;i<=s.len;i++) t2[i]=t2[i-1]+t1[i-1];
for(i=1;i<=s.len;i++) tt[ t2[rank2[i]]++ ]=i;
Init_t(); /* 第二关键字 */
t2[0]=1;
for(i=1;i<=s.len;i++) t1[ rank1[tt[i]] ]++;
for(i=1;i<MAX_DATA;i++) t2[i] = t2[i-1] + t1[i-1];
for(i=1;i<=s.len;i++) tt2[ t2[rank1[tt[i]]]++ ] = tt[i];
for(i=1;i<=s.len;i++) /* 从tt到rank */
{
rank[tt2[i]]=i;
if(rank1[tt2[i]]==rank1[tt2[i-1]]&&rank2[tt2[i]]==rank2[tt2[i-1]])
rank[tt2[i]]=rank[tt2[i-1]];
}
}
if(x>s.len) return; /* 倍增 */
Get_Rank_f(x*2);
}
void Get_Sa()
{
int i;
for(i=1;i<=s.len;i++)
sa[rank[i]]=i;
return;
}
void Get_Rank()
{
Get_Rank_f(1);
}
void Get_H()
{
int i,j;
h[0]=0;
for(i=1;i<=s.len;i++) /* h[i]>=h[i-1]-1 */
{
if(h[i-1]<1)
j=0;
else
j=h[i-1]-1;
while(s.str[i+j]==s.str[sa[rank[i]-1]+j]) j++;
h[i]=j;
}
}
void Get_Height()
{
int i;
for(i=1;i<=s.len;i++)
height[rank[i]]=h[i];
}
int BuildTree()
{
int i,j;
int stack_LCP[MAX_DATA],top_LCP;
top_LCP=0;
stack_LCP[1]=0;
for(i=1;i<MAX_DATA;i++)
{
descar[i].dat=0;
descar[i].father=0;
descar[i].l=0;
descar[i].r=0;
descar[i].p=0;
descar[i].num_a=0;
descar[i].num_b=0;
descar[i].num_a_l=0;
descar[i].num_b_l=0;
descar[i].num_a_r=0;
descar[i].num_b_r=0;
}
for(i=3;i<=s.len;i++)
{
descar[i].dat=height[i];
descar[i].father=0;
descar[i].l=0;
descar[i].r=0;
descar[i].p=0;
descar[i].num_a=0;
descar[i].num_b=0;
descar[i].num_a_l=0;
descar[i].num_b_l=0;
descar[i].num_a_r=0;
descar[i].num_b_r=0;
while(top_LCP>=0)
{
if(top_LCP==0)
{
descar[i].l=stack_LCP[1];
descar[descar[i].l].p=i;
break;
}
if(descar[stack_LCP[top_LCP]].dat<=descar[i].dat)
{
descar[i].p=stack_LCP[top_LCP];
descar[i].l=descar[stack_LCP[top_LCP]].r;
descar[descar[i].p].r=i;
descar[descar[i].l].p=i;
break;
}
top_LCP--;
}
top_LCP++;
stack_LCP[top_LCP]=i;
}
head_descar=stack_LCP[1];
return stack_LCP[1];
}
void SA_GetAll()
{
int i;
for(i=0;i<MAX_DATA;i++)
{
rank[i]=0;
rank1[i]=0;
rank2[i]=0;
height[i]=0;
h[i]=0;
sa[i]=0;
}
Get_Rank();
Get_Sa();
Get_H();
Get_Height();
}
/********* Main *****************/
char s1[MAX_DATA];
int k;
int a_len,b_len;
long long ans;
void dfs(int x)
{
long long t=0;
long long t1=0;
long long t2=0;
long long t3;
if(descar[x].l!=0)
dfs(descar[x].l);
if(descar[x].r!=0)
dfs(descar[x].r);
if(descar[x].l!=0)
{
descar[x].num_a_l+=descar[descar[x].l].num_a;
descar[x].num_b_l+=descar[descar[x].l].num_b;
}
if(descar[x].r!=0)
{
descar[x].num_a_r+=descar[descar[x].r].num_a;
descar[x].num_b_r+=descar[descar[x].r].num_b;
}
if(sa[x-1]<=a_len && descar[x].l==0) descar[x].num_a_l++;
if(sa[x-1]>a_len && descar[x].l==0) descar[x].num_b_l++;
if(sa[x]<=a_len && descar[x].r==0) descar[x].num_a_r++;
if(sa[x]>a_len && descar[x].r==0) descar[x].num_b_r++;
descar[x].num_a=descar[x].num_a_l+descar[x].num_a_r;
descar[x].num_b=descar[x].num_b_l+descar[x].num_b_r;
if(descar[x].dat>=k)
{
t1 =descar[x].num_a_l;
t1*=descar[x].num_b_r;
t2 =descar[x].num_b_l;
t2*=descar[x].num_a_r;
t3 =descar[x].dat-k+1;
ans+=(t1+t2)*t3;
}
}
void InitS()
{
scanf("%s",s1);
a_len=strlen(s1);
s.str[1]='\0';
strcat(s.str+1,s1);
s.len=a_len;
s.str[s.len+1]='$';
s.str[s.len+2]='\0';
scanf("%s",s1);
b_len=strlen(s1);
strcat(s.str+1,s1);
s.len=a_len+b_len+1;
s.str[s.len+1]='!';
s.str[s.len+2]='\0';
}
int main(int argc, char *argv[])
{
int i,j;
while(1)
{
scanf("%d",&k);
if(k==0)
return 0;
InitS();
SA_GetAll();
BuildTree();
ans=0;
dfs(head_descar);
printf("%I64d\n",ans);
}
return 0;
}
/********* END ******************/
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator