FOJ 题目 2075 Substring (后缀数组求出现k次的最小字典序子串)

Problem 2075 Substring

Accept: 70    Submit: 236

Time Limit: 1000 mSec    Memory Limit : 65536 KB

Problem Description

Given a string, find a substring of it which the original string contains exactly n such substrings.

Input

There are several cases. The first line of each case contains an integer n.The second line contains a string, no longer than 100000.

Output

If the such substring doesn‘t exist, output "impossible", else output the substring that appeared n times in the original string.If there are multiple solutions, output lexicographic smallest substring.

Sample Input

2ababba

Sample Output

ac代码

<pre name="code" class="cpp"><img src="data:image/png;base64,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" alt="" />、
<pre name="code" class="cpp">#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#define min(a,b) (a>b?b:a)
#define max(a,b) (a>b?a:b)
using namespace std;
char str[103030];
int sa[103030],Rank[103030],rank2[103030],height[103030],c[103030],*x,*y;
int n;
void cmp(int n,int sz)
{
    int i;
    memset(c,0,sizeof(c));
    for(i=0;i<n;i++)
        c[x[y[i]]]++;
    for(i=1;i<sz;i++)
        c[i]+=c[i-1];
    for(i=n-1;i>=0;i--)
        sa[--c[x[y[i]]]]=y[i];
}
void build_sa(char *s,int n,int sz)
{
    x=Rank,y=rank2;
    int i,j;
    for(i=0;i<n;i++)
        x[i]=s[i],y[i]=i;
    cmp(n,sz);
    int len;
    for(len=1;len<n;len<<=1)
    {
        int yid=0;
        for(i=n-len;i<n;i++)
        {
            y[yid++]=i;
        }
        for(i=0;i<n;i++)
            if(sa[i]>=len)
                y[yid++]=sa[i]-len;
            cmp(n,sz);
        swap(x,y);
        x[sa[0]]=yid=0;
        for(i=1;i<n;i++)
        {
            if(y[sa[i-1]]==y[sa[i]]&&sa[i-1]+len<n&&sa[i]+len<n&&y[sa[i-1]+len]==y[sa[i]+len])
                x[sa[i]]=yid;
            else
                x[sa[i]]=++yid;
        }
        sz=yid+1;
        if(sz>=n)
            break;
    }
    for(i=0;i<n;i++)
        Rank[i]=x[i];
}
void getHeight(char *s,int n)
{
    int k=0;
    for(int i=0;i<n;i++)
    {
        if(Rank[i]==0)
            continue;
        k=max(0,k-1);
        int j=sa[Rank[i]-1];
        while(s[i+k]==s[j+k])
            k++;
        height[Rank[i]]=k;
    }
}
int minv[103010][20],lg[103030];
void init_lg()
{
    int i;
    lg[1]=0;
    for(i=2;i<102020;i++)
    {
        lg[i]=lg[i>>1]+1;
    }
}
void init_RMQ(int n)
{
    int i,j,k;
    for(i=1;i<=n;i++)
    {
        minv[i][0]=height[i];
    }
    for(j=1;j<=lg[n];j++)
    {
        for(k=0;k+(1<<j)-1<=n;k++)
        {
            minv[k][j]=min(minv[k][j-1],minv[k+(1<<(j-1))][j-1]);
        }
    }
}
int lcp(int l,int r)
{
    l=Rank[l];
    r=Rank[r];
    if(l>r)
        swap(l,r);
    l++;
    int k=lg[r-l+1];
    return min(minv[l][k],minv[r-(1<<k)+1][k]);
}
void solve(int n,int k)
{
	int i,j;
	for(i=1;i<=n;i++)
	{
		if(i+k-1>n)
			break;
		int t=lcp(sa[i],sa[i+k-1]);
		if(t>height[i]&&(i+k>n||t+k<=n&&t>height[i+k]))
		{
			for(j=0;j<t;j++)
			{
				printf("%c",str[j+sa[i]]);
			}
			printf("\n");
			return;
		}
	}
	printf("impossible\n");
}
int main()
{
	int n;
	while(scanf("%d",&n)!=EOF)
	{
		scanf("%s",str);
		int len=strlen(str);
		build_sa(str,len+1,128);
		getHeight(str,len);
		init_lg();
		init_RMQ(len);
		solve(len,n);
	}
}



Source

FOJ有奖月赛-2012年3月

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-09 15:48:19

FOJ 题目 2075 Substring (后缀数组求出现k次的最小字典序子串)的相关文章

POJ - 3693 Maximum repetition substring(后缀数组求重复次数最多的连续重复子串)

Description The repetition number of a string is defined as the maximum number R such that the string can be partitioned into R same consecutive substrings. For example, the repetition number of "ababab" is 3 and "ababa" is 1. Given a

HDU 5008西安网络赛B题:后缀数组求第k小子串

思路:尼玛,这题搞了一天了,比赛的时候用了n^2的方法绝对T了,然后今天看别人代码看了一天才知道.后面感觉也挺容易的,就是没想到,之前做过SPOJ 694 705求过不同子串了,知道怎么求不同子串个数了,但是比赛的时候这个技巧竟然抛在脑后了,然后就不会了. 但是今天自己用了自己的两个后缀数组的模板(倍增和DC3)的都WA了,搞得自己真想跳楼去了!! 到现在都不知道到底是哪里错了,处理的方法和标准做法都一样,但是就是WA,然后用了别人的模板,再用自己的处理方法就过了,怀疑自己的两个模板是不是哪里错

POJ 3693 Maximum repetition substring(后缀数组求最长重复子串)

题目大意:和spoj687类似,就是当长度相同是需要输出一个最小的字典序的序列. 解体思路:这次需要枚举所有的从i到d = i-L/i (d = i-L%i)的位置,然后记录保证最大值的同时,求出来字典序最小的. Maximum repetition substring Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7418   Accepted: 2217 Description The repetition numb

POJ 题目3294Life Forms(后缀数组求超过k个的串的最长公共子串)

Life Forms Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 11178   Accepted: 3085 Description You may have wondered why most extraterrestrial life forms resemble humans, differing by superficial traits such as height, colour, wrinkles, e

UVA 题目760 DNA Sequencing (后缀数组求两个串最长公共子串,字典序输出)

 DNA Sequencing  A DNA molecule consists of two strands that wrap around each other to resemble a twisted ladder whose sides, made of sugar and phosphate molecules, are connected by rungs of nitrogen-containing chemicals called bases. Each strand is

poj 3693 后缀数组求重复次数最多的连续重复子串

#include<iostream> #include<cstring> #include<set> #include<map> #include<cmath> #include<stack> #include<queue> #include<deque> #include<list> #include<algorithm> #include<stdio.h> #includ

poj 1743 二分答案+后缀数组 求不重叠的最长重复子串

题意:给出一串序列,求最长的theme长度 (theme:完全重叠的子序列,如1 2 3和1 2 3  or  子序列中每个元素对应的差相等,如1 2 3和7 8 9) 要是没有差相等这个条件那就好办多了,直接裸题. 一开始想了个2B方法,后来发现真心2B啊蛤蛤蛤 1 for i=1 to 88 do 2 { 3 for j=1 to length 4 { 5 r2[j]=r[j]+i; 6 if (r2[j]>88) r2[i]-=88; 7 } 8 把新序列r2连接到原序列r的后面 9 pr

HDU3518 后缀数组求不可重叠重复出现的不同子串个数

枚举子串长度,根据height分组,如果本组sa最小值与sa最大值之差超过枚举的长度,则本组对于答案贡献为1. 1 #include <iostream> 2 #include <vector> 3 #include <algorithm> 4 #include <string> 5 #include <string.h> 6 #include <stdio.h> 7 #include <queue> 8 #include

HDU 5249 离线树状数组求第k大+离散化

KPI Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1160    Accepted Submission(s): 488 Problem Description 你工作以后, KPI 就是你的全部了. 我开发了一个服务,取得了很大的知名度.数十亿的请求被推到一个大管道后同时服务从管头拉取请求.让我们来定义每个请求都有一个重要值.我的