Cod sursa(job #2140807)

Utilizator ovidius11Stiriu Ovidius ovidius11 Data 23 februarie 2018 21:34:41
Problema Substr Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.55 kb
#include<cstdio>
#include<cstring>
using namespace std;
#define mod 666013
int p[16390],n,k,cnt[666015],z[40005];
char ch[16390],c[40005];
int calc(char ch){
if (ch>='0' && ch<='9')
return ch-48;
if (ch>='A' && ch<='Z')
return ch-55;
return ch-61;}
int check(int poz,int le){
int u=0,i;
for(i=poz;i<=poz+le-1;i++)
c[++u]=ch[i];
c[++u]='$';
for(i=1;i<=n;i++)
c[++u]=ch[i];
int l=1,r=1;
for(i=2;i<=u;i++){
if (i>r){
l=r=i;
while(c[r]==c[r-l+1])
r++;
r--;
z[i]=r-l+1;}
else{
if (r-i+1>z[i-l+1])
z[i]=z[i-l+1];
else{
l=r=i;
while(c[r]==c[r-l+1])
r++;
r--;
z[i]=r-l+1;}}}
int nr=0;
for(i=le+2;i<=u;i++)
if (z[i]==le)
nr++;
if (nr>=k)
return 1;
return 0;}
int verif(int l){
int num=0,i;
memset(cnt,0,sizeof(cnt));
for(i=1;i<=l;i++)
num=(num+p[l-i]*calc(ch[i]))%mod;
cnt[num]++;
for(i=2;i<=n-l+1;i++){
num=(num-(p[l-1]*calc(ch[i-1]))%mod+mod)%mod;
num=(num*62)%mod;
num=(num+calc(ch[i+l-1]))%mod;
cnt[num]++;}
num=0;
for(i=1;i<=l;i++)
num=(num+p[l-i]*calc(ch[i]))%mod;
if (cnt[num]>=k)
if (check(1,l))
return 1;
for(i=2;i<=n-l+1;i++){
num=(num-(p[l-1]*calc(ch[i-1]))%mod+mod)%mod;
num=(num*62)%mod;
num=(num+calc(ch[i+l-1]))%mod;
if (cnt[num]>=k)
if (check(i,l))
return 1;}
return 0;}
int main(){
freopen("substr.in","r",stdin);
freopen("substr.out","w",stdout);
int i,st,dr,mij,last;
scanf("%d%d\n",&n,&k);
p[0]=1;
for(i=1;i<=n;i++)
p[i]=(p[i-1]*62)%mod;
fgets(ch+1,16384,stdin);
st=1;
dr=n;
while(st<=dr){
mij=(st+dr)/2;
if (verif(mij)){
last=mij;
st=mij+1;}
else
dr=mij-1;}
printf("%d\n",last);
return 0;}