Pagini recente » Cod sursa (job #1698937) | Cod sursa (job #2534647) | Cod sursa (job #2626773) | Cod sursa (job #739647) | Cod sursa (job #1075363)
#include <fstream>
#include <algorithm>
#define MAXN 17000
#define MAXLOGN 15
#define BASE 100000
using namespace std;
ifstream f("substr.in");
ofstream g("substr.out");
int n,m,poz[2*MAXN],ord[MAXN],cnt,sol;
long long v[MAXN];
char s[MAXN];
bool ok;
bool Comp(int a,int b){
return v[a]<v[b];}
int main()
{
int i,j;
f>>n>>m;
if(m==1){
g<<n<<'\n';
return 0;}
f.getline(s,MAXN,'\n');
f.getline(s+1,MAXN,'\n');
for(i=1;i<=n;i++){
ord[i]=i;
v[i]=s[i]-'0'+1;}
sort(ord+1,ord+n+1,Comp);
cnt=ok=0;
for(i=1;i<=n;i++){
if(v[ord[i]]==v[ord[i-1]]){
cnt++;
poz[ord[i]]=poz[ord[i-1]];}
else{
if(cnt>=m-1)
ok=1;
cnt=0;
poz[ord[i]]=i;}}
if(!ok&&cnt<m-1){
g<<"0\n";
return 0;}
for(i=1;i<MAXLOGN;i++){
for(j=1;j<=n;j++)
v[j]=1LL*poz[j]*BASE+poz[j+(1<<(i-1))];
sort(ord+1,ord+n+1,Comp);
cnt=ok=0;
for(j=1;j<=n;j++){
if(v[ord[j]]==v[ord[j-1]])
cnt++;
else{
if(cnt>=m-1)
ok=1;
cnt=0;}}
if(!ok&&cnt<m-1)
break;
for(j=1;j<=n;j++){
if(v[ord[j]]==v[ord[j-1]])
poz[ord[j]]=poz[ord[j-1]];
else
poz[ord[j]]=j;}}
i--;
sol+=(1<<i);
for(i=i-1;i>=0;i--){
for(j=1;j<=n;j++)
v[j]=1LL*poz[j]*BASE+poz[j+(1<<i)];
sort(ord+1,ord+n+1,Comp);
ok=cnt=0;
for(j=1;j<=n;j++){
if(v[ord[j]]==v[ord[j-1]])
cnt++;
else{
if(cnt>=m-1){
ok=1;
break;}
cnt=0;}}
if(!ok&&cnt<m-1)
continue;
sol+=(1<<i);
for(j=1;j<=n;j++){
if(v[ord[j]]==v[ord[j-1]])
poz[ord[j]]=poz[ord[j-1]];
else
poz[ord[j]]=j;}}
g<<sol<<'\n';
f.close();
g.close();
return 0;
}