Pagini recente » Cod sursa (job #1304098) | Cod sursa (job #89568) | Cod sursa (job #127056) | Cod sursa (job #341818) | Cod sursa (job #2385514)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <string.h>
using namespace std;
ifstream f("substr.in");
ofstream g("substr.out");
struct du2{
pair <int,int> p;
int poz;}v[20000];
bool cmp2(du2 a, du2 b){
if(a.p.first<b.p.first)
return true;
if(a.p.first==b.p.first)
if(a.p.second < b.p.second)
return true;
return false;
}
int n,m,i,d[20000][100],len,k,sol,logN,ss[20000],viz[300],nr;
char s[20000];
int cmlp(int x,int y){
int sol = 0;
if(x==y)
return n;
for(int k = logN; k>=0; k--){
if(d[x][k]==d[y][k]){
x+=(1<<k);
y+=(1<<k);
if(x>n||y>n)
break;
sol+=(1<<k);
}
}
return sol;
}
int main()
{
f>>n>>m>>s;
int len = strlen(s);
for(i=0;i<len;i++)
d[i][0]=s[i]-'0';
for(k=1;(1<<(k-1))<=n;k++){
for(i=0;i<len;i++){
int j = i+(1<<(k-1));
if(j>=len)
v[i].p=make_pair(d[i][k-1],-1);
else
v[i].p=make_pair(d[i][k-1],d[j][k-1]);
v[i].poz=i;
}
sort(v,v+len,cmp2);
nr = 0;
d[v[0].poz][k] = 0;
for(i=1;i<len;i++){
if((v[i-1].p.first != v[i].p.first) || (v[i-1].p.second != v[i].p.second))
nr++;
d[v[i].poz][k] = nr;
}
}
logN = k-1;
for(i=0;i<len;i++)
ss[d[i][logN]]=i;
for(i=0;i+m-1<len;i++){
int x = ss[i];
int y = ss[i+m-1];
sol = max(sol,cmlp(x,y));
}
g<<sol;
return 0;
}