Pagini recente » Cod sursa (job #848380) | Cod sursa (job #2675874) | Cod sursa (job #2354629) | Cod sursa (job #1521368) | Cod sursa (job #1048915)
#include<fstream>
#include<string>
#include<algorithm>
using namespace std;
const int MAXN = 17003;
const int MAXLG = 16;
struct entry {
int nr[2], p;
} L[MAXN];
int P[MAXLG][MAXN], Q[MAXN], N, stp, K;
string s;
bool cmp(const entry &a, const entry &b) {
return a.nr[0] == b.nr[0] ? (a.nr[1] < b.nr[1]) : (a.nr[0] < b.nr[0]);
}
int lcp(int x,int y){
int k, ans=0;
if (x == y) return N - x;
for(k=stp-1; k>=0 && x < N && y < N; --k)
if(P[k][x] == P[k][y])
{
x+=1<<k; y+=1<<k; ans+=1<<k;
}
return ans;
}
int main(){
ifstream f("substr.in");
ofstream g("substr.out");
int i,cnt,MaxPrefix;
f>>N>>K; getline(f,s);
getline(f,s);
for(i=0;i<N;++i)
P[0][i]=(s[i]-'0');
for( stp=1, cnt=1; cnt >> 1 < N; ++stp, cnt<<=1)
{
for(i=0;i<N;++i)
{
L[i].nr[0] = P[stp-1][i];
L[i].nr[1] = i + cnt < N ? P[stp-1][i+cnt] : -1 ;
L[i].p = i;
}
sort(L, L+N, cmp);
for (i = 0; i < N; ++i)
P[stp][L[i].p] = i > 0 && L[i].nr[0] == L[i - 1].nr[0] && L[i].nr[1] == L[i - 1].nr[1] ? P[stp][L[i - 1].p] : i;
}
for(i=0;i<N;++i) Q[P[stp-1][i]]=i;
MaxPrefix = 0;
for(i=0;i<N-K+1;++i)
MaxPrefix=max(MaxPrefix,lcp(Q[i],Q[i+K-1]));
g<<MaxPrefix;
return 0;
}