Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
int main()
{
	int n;
	int count = 0;
	while (scanf("%d", &n) == 1)
	{
		for (int i = 0; i < n; i++)
		{
			char c;
			scanf(" %c", &c);
			r[i] = c - 'A' + 1;
		}
		r[n] = 'Z' -'A' + 2;
		for (int i = n + 1; i <= 2 * n; i++)
			r[i] = r[2 * n - i];
		r[2 * n + 1] = 0;
		//for (int i = 0; i <= 2 * n + 1; i++) printf("%d ", r[i]);
		//puts("");
		da(r, sa, 2 * n + 2, 'Z' - 'A' + 3);
		calheight(r, sa, 2 * n + 1);
		//for (int i = 0; i <= 2 * n; i++)
		//	printf("%d ", rank[i]);
		int pre = 0, post = n+1;
		for (int i = 0; i < n; i++)
		{
			if (rank[pre] < rank[post])
				printf("%c", 'A' + r[pre++] - 1);
			else printf("%c", 'A' + r[post++] - 1);
			if (++count == 80)
			{
				puts("");
				count-=80;
			}
		}
		//puts("");
	}
	puts("");
	return 0;
}
Ejemplo n.º 3
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;
}
Ejemplo n.º 4
0
int main()
{
	int cas = 0;
	while (scanf("%s", s) && s[0] != '#')
	{
		int l = strlen(s);
		for (int i = 0; i < l; i++) r[i] = s[i] - 'a' + 1;
		r[l] = 0;
		da(r, sa, l+1, 27);
		calheight(r, sa, l);
		init_rmq(l);
		int ans = 0;
		for (int i = 1; i <= l / 2; i++)
		for (int j = 0; j + i < l; j+=i)
		{
			int k = lcp(j, j+i);
			int x = k / i + 1;
			if (x + 1 < ans) continue;
			int aa = i - k % i;
			bool flag = 0;
			if (j >= aa)
			{
				int kk = lcp(j-aa, j+i-aa);
				int xx = kk / i + 1;
				if (xx > x) x = xx, flag = 1;
			}

		//	if (j-aa >= 0 && lcp(j-aa, j+i-aa) >= (x+1) * (i-1)) x++, flag = 1;
			if (ans < x)
			{
				ans = x;
				cnt = 0;
				zz[cnt] = flag ? j-aa : j;
				zz1[cnt++] = i;
			}
			else if (ans == x) 
			{	
				zz[cnt] = flag ? j-aa : j;
				zz1[cnt++] = i;
			}	
		}
		printf("Case %d: ", ++cas);
		char cc = 'z';
		if (ans == 1)
		{
			for (int i = 0; i < l; i++)
				if (s[i] < cc) cc = s[i];
			printf("%c\n", cc);
			continue;
		}
		int start = zz[0];
		int l0 = zz1[0];
		for (int i = 0; i < cnt; i++)
		{
			int k = lcp(zz[i], zz[i]+zz1[i]);
			int aa = k - k % zz1[i];
			for (int j = zz[i]; j >= 0 && j >= zz[i]-aa; j--)
				if (lcp(j, j+zz1[i]) < (ans-1) * zz1[i]) break;
				else if (rank[j] < rank[start]) 
				{
					start = j;
					l0 = zz1[i];
				}
		}
		s[start+l0*ans] = '\0';
		puts(s+start);
	}
	return 0;
}