POJ 1743 Musical Theme

解题思路:将原数组每一位减去前一位得到新的数组B,题目转化为求解不小于3的不重叠最长重复字串

代码
#include <iostream>
using namespace std;

const int MAX_LEN = 20005;

#define MAXNUM 100000
#define MINNUM -1

int wa[MAX_LEN], wb[MAX_LEN], wv[MAX_LEN], wd[MAX_LEN], Height[MAX_LEN], sa[MAX_LEN], rank[MAX_LEN];
int n;

inline
bool IsEqual(int *r, int a, int b, int l)
{
return (r[a] == r[b] && r[a + l] == r[b + l]);
}

void da(int *r, int m)
{
int i, j, p, *x = wa, *y = wb, *t;
memset(wd,
0, sizeof(wd));
for (i = 0; i < n; i++) wd[x[i] = r[i]]++; x[n] = y[n] = 0;
for (i = 1; i < m; i++) wd[i] += wd[i - 1];
for (i = n - 1; i >= 0; i--) sa[--wd[x[i]]] = i;

for (p = 1, j = 1; p <= n; m = p, j *= 2)
{
for(p = 0, 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 < n; i++) wv[i] = x[y[i]];
memset(wd,
0, sizeof(wd));
for(i = 0; i < n; i++) wd[wv[i]]++;
for(i = 1; i < m; i++) wd[i] += wd[i - 1];
for(i = n - 1; i >= 0; i--) sa[--wd[wv[i]]] = y[i];
for(t = x, x = y, y = t, i = 1, p = 2,x[sa[0]] = 1; i < n; i++)
x[sa[i]]
= IsEqual(y, sa[i-1], sa[i], j) ? p - 1 : p++;
}
}

void CalHeight(int *r)
{
int i, j, k;
for (i = 0; i < n; i++)rank[sa[i]] = i;
for (i = 0, Height[0] = k = 0; i < n; Height[rank[i++]] = k)
for (k?k--:0, j=(rank[i]>0)?sa[rank[i]-1]:0; rank[i]>0&&r[i+k]==r[j+k]; k++);
}

int main()
{
int i,j,sb,se,mid,ans,m[MAX_LEN],r[MAX_LEN],minsa, maxsa;
while (scanf("%d", &n)&&n)
{
for(i=0;i<n;i++)scanf("%d",&m[i]);n--;
for(i=0,j=MAXNUM;i<n;i++)r[i]=m[i+1]-m[i],j=min(j, r[i]);
for(i=0;i<n;i++)r[i] -= (j - 1);r[n]=0;
da(r,
180);
CalHeight(r);
for (sb=4,se=n/2+1,mid=(sb + se)/2,ans=-1;sb<se;)
{
for(i = 0,minsa=MAXNUM,maxsa=MINNUM; i < n; i++)
{
if(Height[i]<mid)
{
if(maxsa - minsa >= mid)break;
else minsa=sa[i],maxsa=sa[i];
}
if(Height[i]>=mid)
maxsa
= max(maxsa, sa[i]),minsa = min(minsa, sa[i]);
}
if(maxsa - minsa >= mid && mid == se){ans = se;break;}
if(maxsa - minsa >= mid)(sb==mid&&se>sb)? (ans=sb,mid=se):(sb=mid);
else se = mid - 1, mid = (sb+se) / 2;
}
printf(
"%d\n", ans+1);
}
return 0;
}

 

posted on 2010-11-30 13:36  ltang  阅读(604)  评论(1编辑  收藏  举报

导航