UVA 4513

来源:互联网 发布:boundgods能从淘宝买吗 编辑:程序博客网 时间:2024/05/01 23:37

题目描述

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;#define N 40000 + 10#define x 123typedef unsigned long long LL;int m, len;LL xp[N], H[N];char s[N];LL V[N];LL mark;int pos;struct Haa{    LL v;    int id;}Ha[N];int cmp(Haa a, Haa b){    return (a.v == b.v) ? (a.id < b.id) : (a.v < b.v);}void init(){    xp[0] = 1;    for(int i = 1; i <= len; i++) xp[i] = xp[i - 1] * x;    H[len] = 0;    for(int i = len - 1; i >= 0; i--) H[i] = H[i + 1] * x + (s[i] - 'a');}bool Find(int L){    if(L > len) return false;    pos = -1;    int tmp = 0;    for(int i = 0; i + L - 1 <= len - 1; i++)    {        Ha[i].id = i;        Ha[i].v = H[i] - H[i + L] * xp[L];    }    sort(Ha, Ha + len - L + 1, cmp);//    cout<<"L is : "<<L<<"  Hash is : ";//    for(int i = 0; i <= len - L; i++) cout<<Ha[i].v<<"   ";//    cout<<endl;    int num = 1;    for(int i = 1; i <= len - L; i++)    {        if(Ha[i].v == Ha[i - 1].v)  num++;        else {                if(num >= m && Ha[i - 1].id > pos)                    {                        pos = Ha[i - 1].id;                    }                num = 1;        }    }    if(num >= m && Ha[len - L].id > pos)    {        pos = Ha[len - L].id;    }    return pos >= 0;}int main(){    while(~scanf("%d", &m) && m)    {        scanf("%s", s);        len = strlen(s);        init();        Find(1);        int l = 0, r = len + 1;        while(l + 1 < r)        {            int mid = (l + r) >> 1;            if(Find(mid)) l = mid;            else r = mid;        }        if(l == 0) printf("none\n");        else {                Find(l);                printf("%d %d\n", l, pos);        }    }    return 0;}/*3baaaababababbababbab11baaaababababbababbab3cccccc2babab0*/


0 0