コード例 #1
0
int main()
{
  int i , j , n , m = 0 ;
  char ch;
  scanf("%d", &n );
  getchar();
  for( i = 0 ; i <= n ; ++ i )
    {
      scanf("%c", &ch );
      r[ i ] = ch - 48;
      m = m > r[ i ] ? m : r[ i ] + 1 ;
    }
  for( i = 0 ; i < n ; ++ i ) printf("%d ",r[ i ]);printf("\n");
  //r[ n ++ ] = 0 ;
  dc3( r , sa , n , m );
  
  
  for( i = 0 ; i < n ; ++ i )
    printf("%d ",sa[ i ]);
  printf("\n");
  
  /*
  calheight( r , sa , n );
  for( i = 0 ; i < n ; ++ i ) printf("%d ",rank[ i ]);printf("\n");
  initRMQ( n );
  printf("!!!!\n");
  while( 1 )
    {
      int a,b;
      scanf("%d%d",&a,&b);
      printf("%d %d\n", askRMQ( a , b ) , lcp( a , b ));
    }
  */
  return 0;
}
コード例 #2
0
ファイル: ural1297_dc3.cpp プロジェクト: Voleking/ICPC
int main()
{
    int i,n,len,k,ans=0,w;
    scanf("%s",st);
    len=strlen(st);
    for(i=0;i<len;i++) r[i]=st[i];
    r[len]=1;
    for(i=0;i<len;i++) r[i+len+1]=st[len-1-i];
    n=len+len+1;
    r[n]=0;
    dc3(r,sa,n+1,128);
    calheight(r,sa,n);
    for(i=1;i<=n;i++) RMQ[i]=height[i];
    initRMQ(n);
    for(i=0;i<len;i++)
    {
      k=lcp(i,n-i);
      if(k*2>ans) ans=k*2,w=i-k;
      k=lcp(i,n-i-1);
      if(k*2-1>ans) ans=k*2-1,w=i-k+1;
    }
    st[w+ans]=0;
    printf("%s\n",st+w);
    return 0;
}
コード例 #3
0
ファイル: sa_dc3.cpp プロジェクト: xyiyy/icpc
void dc3(int *r, int *sa, int n, int m) {
    int j, *rn = r + n, *san = sa + n, ta = 0, tb = (n + 1) / 3, tbc = 0, p;
    r[n] = r[n + 1] = 0;
    rep(i, n)
    if (i % 3 != 0) wa[tbc++] = i;
    rsort(r + 2, wa, wb, tbc, m);
    rsort(r + 1, wb, wa, tbc, m);
    rsort(r, wa, wb, tbc, m);
    for (p = 1, rn[F(wb[0])] = 0, j = 1; j < tbc; j++)
        rn[F(wb[j])] = c0(r, wb[j - 1], wb[j]) ? p - 1 : p++;
    if (p < tbc) dc3(rn, san, tbc, p);
    else rep(i, tbc)
    san[rn[i]] = i;
    rep(i, tbc)
    if (san[i] < tb) wb[ta++] = san[i] * 3;
    if (n % 3 == 1) wb[ta++] = n - 1;
    rsort(r, wb, wa, ta, m);
    rep(i, tbc)
    wv[wb[i] = G(san[i])] = i;
    int i;
    for (i = j = p = 0; i < ta && j < tbc; p++)
        sa[p] = c12(wb[j] % 3, r, wa[i], wb[j]) ? wa[i++] : wb[j++];
    for (; i < ta; p++) sa[p] = wa[i++];
    for (; j < tbc; p++) sa[p] = wb[j++];
}
コード例 #4
0
inline void dc3(int *str,int *sa,const int &n,const int &m)
{
    int *strn(str+n);
    int *san(sa+n),tb((n+1)/3),ta(0),tbc(0),i,j,k;
    str[n]=str[n+1]=0;
    for(i=0; i<n; ++i)
        if(i%3)
            wa[tbc++]=i;
    sort(str+2,wa,wb,tbc,m);
    sort(str+1,wb,wa,tbc,m);
    sort(str,wa,wb,tbc,m);
    for(i=j=1,strn[F(wb[0])]=0; i<tbc; ++i)
        strn[F(wb[i])]=c0(str,wb[i-1],wb[i])?j-1:j++;
    if(j<tbc)
        dc3(strn,san,tbc,j);
    else
        for(i=0; i<tbc; ++i)
            san[strn[i]]=i;
    for(i=0; i<tbc; ++i)
        if(san[i]<tb)
            wb[ta++]=san[i]*3;
    if(n%3==1)
        wb[ta++]=n-1;
    sort(str,wb,wa,ta,m);
    for(i=0; i<tbc; ++i)
        wv[wb[i]=G(san[i])]=i;
    for(i=j=k=0; i<ta && j<tbc;)
        sa[k++]=c12(str,wb[j]%3,wa[i],wb[j])?wa[i++]:wb[j++];
    while(i<ta)
        sa[k++]=wa[i++];
    while(j<tbc)
        sa[k++]=wb[j++];
}
コード例 #5
0
ファイル: 字符串.cpp プロジェクト: syw111111/ACM
void da(int str[], int sa[], int rnk[], int height[], int n, int m) {
  for (int i = n; i < n * 3; i++) { str[i] = 0; }
  dc3(str, sa, n + 1, m);
  int i, j, k = 0;
  for (i = 0; i <= n; i++) { rnk[sa[i]] = i; }
  for (i = 0; i < n; i++) {
    if (k) { k--; }
    j = sa[rnk[i] - 1];
    while (str[i + k] == str[j + k]) { k++; }
    height[rnk[i]] = k;
  }
}
コード例 #6
0
ファイル: spoj694_dc3.cpp プロジェクト: Voleking/ICPC
int main()
{
    int i,n,t,ans;
    scanf("%d",&t);
    while(t-->0)
    {
      scanf("%s",s);
      n=strlen(s);
      for(i=0;i<n;i++) r[i]=s[i];
      r[n]=0;
      dc3(r,sa,n+1,128);
      calheight(r,sa,n);
      ans=n*(n+1)/2;
      for(i=1;i<=n;i++) ans-=height[i];
      printf("%d\n",ans);
    }
    return 0;
}
コード例 #7
0
int main()
{
    scanf("%d %d",&n,&j);
    for(i=0; i<n; ++i)
    {
        scanf("%d",&k);
        num[i]=k-j+100;
        j=k;
    }
    num[n]=0;

    dc3(num,sa,n+1,191); //`191: str中取值范围,桶排序`

    for(i=1; i<=n; ++i) // `rank数组`
        rk[sa[i]]=i;
    for(i=k=0; i<n; ++i) // `lcp数组`
        if(!rk[i])
            lcpa[0]=0;
        else
        {
            j=sa[rk[i]-1];
            if(k>0)
                --k;
            while(num[i+k]==num[j+k])
                ++k;
            lcpa[rk[i]]=k;
        }


    for(i=1; i<=n; ++i)
        sptb[0][i]=i;
    for(i=1; i<=lg[n]; ++i) //sparse table RMQ
    {
        k=n+1-(1<<i);
        for(j=1; j<=k; ++j)
        {
            a=sptb[i-1][j];
            b=sptb[i-1][j+(1<<(i-1))];
            sptb[i][j]=lcpa[a]<lcpa[b]?a:b;
        }
    }
}
コード例 #8
0
ファイル: ural1517_dc3.cpp プロジェクト: Voleking/ICPC
int main()
{
    int i,j,n,ans=0,w;
    scanf("%d",&j);
    scanf("%s",s);
    s[j]=1;
    scanf("%s",s+j+1);
    n=j+j+1;
    for(i=0;i<n;i++) r[i]=s[i];
    r[n]=0;
    dc3(r,sa,n+1,128);
    calheight(r,sa,n);
    for(i=2;i<=n;i++)
    if(height[i]>ans)
    if((j<sa[i-1] && j>sa[i])
    || (j>sa[i-1] && j<sa[i])) ans=height[i],w=sa[i];
    s[w+ans]=0;
    printf("%s\n",s+w);
    return 0;
}
コード例 #9
0
ファイル: 字符串.cpp プロジェクト: syw111111/ACM
void dc3(int *r, int *sa, int n, int m) {
  int i, j, *rn = r + n;
  int *san = sa + n, ta = 0, tb = (n + 1) / 3, tbc = 0, p;
  r[n] = r[n + 1] = 0;
  for (i = 0; i < n; i++) { if (i % 3 != 0) { wa[tbc++] = i; } }
  Sort(r + 2, wa, wb, tbc, m);
  Sort(r + 1, wb, wa, tbc, m);
  Sort(r, wa, wb, tbc, m);
  for (p = 1, rn[F(wb[0])] = 0, i = 1; i < tbc; i++) {
    rn[F(wb[i])] = c0(r, wb[i - 1], wb[i]) ? p - 1 : p++;
  }
  if (p < tbc) { dc3(rn, san, tbc, p); }
  else { for (i = 0; i < tbc; i++) { san[rn[i]] = i; } }
  for (i = 0; i < tbc; i++) { if (san[i] < tb) { wb[ta++] = san[i] * 3; } }
  if (n % 3 == 1) { wb[ta++] = n - 1; }
  Sort(r, wb, wa, ta, m);
  for (i = 0; i < tbc; i++) { wv[wb[i] = G(san[i])] = i; }
  for (i = 0, j = 0, p = 0; i < ta && j < tbc; p++) {
    sa[p] = c12(wb[j] % 3, r, wa[i], wb[j]) ? wa[i++] : wb[j++];
  }
  for (; i < ta; p++) { sa[p] = wa[i++]; }
  for (; j < tbc; p++) { sa[p] = wb[j++]; }
}
コード例 #10
0
int main() {
	while (scanf("%s", str), strcmp(str, ".") != 0) {
		int len = strlen(str);
		for (int i = 0; i < len; i++) {
			r[i] = str[i];
		}
		r[len] = 0;
		dc3(r, sa, len + 1, 300);
		calheight(r, sa, len);
		/*
		for(int i=0;i<=len;i++){
			printf("%d ", sa[i]);
		}
		puts("");
		for(int i=0;i<len;i++){
			printf("%d ", rank[i]);
		}
		puts("");
		for(int i=1;i<=len;i++){
			printf("%d ", height[i]);
		}
		puts("");
		//*/
		int ans;
		memset(map, 0, sizeof(map));
		make_rmq(len);
		for (int i = 1; i <= len; i++) {
			if (len % i)continue;
			if (check(i, len)) {
				ans = len / i;
				break;
			}
		}
		printf("%d\n", ans);
	}
	return 0;
}
コード例 #11
0
ファイル: BF3PointCircle.cpp プロジェクト: eberlid/ballFind
bool BF3PointCircle::getCircle(BFCoordinate<int> c1, BFCoordinate<int> c2, BFCoordinate<int> c3, BFCircle& circle) {
	BFCoordinate<double> center;
	bool bCenter = BF3PointCircle::getCenter(c1,c2,c3,center);

	if(bCenter == false)
		return false;

	circle.setX0(center.getX());
	circle.setY0(center.getY());

	BFCoordinate<double> dc1(static_cast<double>(c1.getX()), static_cast<double>(c1.getY()));
	BFCoordinate<double> dc2(static_cast<double>(c2.getX()), static_cast<double>(c2.getY()));
	BFCoordinate<double> dc3(static_cast<double>(c3.getX()), static_cast<double>(c3.getY()));

	double r1 = BFCoordinate<double>::distance(center, dc1);
	double r2 = BFCoordinate<double>::distance(center, dc2);
	double r3 = BFCoordinate<double>::distance(center ,dc3);

	double r = (r1+r2+r3)/3.0;

	circle.setR(r);

	return true;
}
コード例 #12
0
ファイル: DC3.cpp プロジェクト: Fengdalu/ICPC
 int main(){
   int n,m=0;	scanf("%d",&n);
   for (int i=0;i<n;i++) scanf("%d",&s[i]),s[i]++,m=max(s[i]+1,m);
   printf("%d\n",m); s[n++]=0; dc3(s,sa,n,m);
   for (int i=0;i<n;i++) printf("%d ",sa[i]);printf("\n");
 }