#include <bits/stdc++.h>
#define clr(x) memset((x), 0, sizeof(x))
#define all(x) (x).begin(), (x).end()
#define pb push_back
#define mp make_pair
#define For(i, st, en) for(int i=(st); i<=(int)(en); i++)
#define Ford(i, st, en) for(int i=(st); i>=(int)(en); i--)
#define forn(i, n) for(int i=0; i<(int)(n); i++)
#define ford(i, n) for(int i=(n)-1; i>=0; i--)
#define fori(it, x) for (__typeof((x).begin()) it = (x).begin(); it != (x).end(); it++)
#define in(x) int (x); input((x));
#define x first
#define y second
#define less(a,b) ((a) < (b) - EPS)
#define more(a,b) ((a) > (b) + EPS)
#define eq(a,b) (fabs((a) - (b)) < EPS)
#define remax(a, b) ((a) = (b) > (a) ? (b) : (a))
#define remin(a, b) ((a) = (b) < (a) ? (b) : (a))
using namespace std;
typedef long double ld; template <class _T> inline _T sqr(const _T& x) {return x * x;} template <class _T> inline string tostr(const _T& a) {ostringstream os(""); os << a; return os.str();} const ld PI = 3.1415926535897932384626433832795L; const ld EPS = 5e-12; char TEMPORARY_CHAR; typedef long long ll; typedef unsigned long long ull; typedef set < int > SI; typedef vector < int > VI; typedef vector < vector < int > > VVI; typedef map < string, int > MSI; typedef pair < int, int > PII; const int INF = 1e9; inline void input(int &a) {a = 0; while (((TEMPORARY_CHAR = getchar()) > '9' || TEMPORARY_CHAR < '0') && (TEMPORARY_CHAR != '-')){} char neg = 0; if (TEMPORARY_CHAR == '-') {neg = 1; TEMPORARY_CHAR = getchar();} while (TEMPORARY_CHAR <= '9' && TEMPORARY_CHAR >= '0') {a = 10 * a + TEMPORARY_CHAR - '0'; TEMPORARY_CHAR = getchar();} if (neg) a = -a;} inline void out(int a) {if (!a) putchar('0'); if (a < 0) {putchar('-'); a = -a;} char s[10]; int i; for(i = 0; a; ++i) {s[i] = '0' + a % 10; a /= 10;} ford(j, i) putchar(s[j]);} inline int nxt() {in(ret); return ret;}
#define bit(a, pos) ((a >> pos) & 1)
struct state
{
int len;
state * link;
state * next[10];
int cnt;
char can;
state()
{
cnt = 0;
len = 0;
link = 0;
can = -1;
memset(next, 0, sizeof(next));
}
};
state * root;
state * last;
void init_sa()
{
root = new state();
last = root;
}
vector <state *> pos[150001];
void extend_sa(int c)
{
state * cur = new state();
cur->len = last->len + 1;
pos[cur->len].pb(cur);
cur->cnt = 1;
state * p = last;
for(; p && !p->next[c]; p = p->link)
p->next[c] = cur;
if (!p)
cur->link = root;
else
{
state * q = p->next[c];
if (p->len + 1 == q->len)
cur->link = q;
else
{
state * clone = new state();
clone->len = p->len + 1;
pos[clone->len].pb(clone);
memcpy(clone->next, q->next, sizeof(q->next));
clone->link = q->link;
for(; p && p->next[c] == q; p = p->link)
p->next[c] = clone;
q->link = cur->link = clone;
}
}
last = cur;
}
ll best = 0;
state * bp;
char can(state * v)
{
if (!v) return 0;
if (v->can != -1)
return v->can;
return v->can = can(v->link);
}
int main()
{
in(n); in(m);
int a[n];
init_sa();
forn(i, n)
{
a[i] = nxt() - 1;
extend_sa(a[i]);
}
for(int i = n; i > 0; --i)
for(int j = 0; j < (int)pos[i].size(); ++j)
{
state * x = pos[i][j];
if (x->link) x->link->cnt += x->cnt;
ll cur = x->len * 1LL * x->cnt;
if (cur > best)
{
best = cur;
bp = x;
}
}
bp->can = 1;
cout << best << endl;
cout << bp->len << endl;
state * cur = root;
for(int i = 0; i < n; ++i)
{
cur = cur->next[a[i]];
if (can(cur))
{
for(int j = 0; j < bp->len; ++j)
{
if (j) cout << " ";
cout << a[i - bp->len + j + 1] + 1;
}
cout << endl;
return 0;
}
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNkZWZpbmUgY2xyKHgpIG1lbXNldCgoeCksIDAsIHNpemVvZih4KSkKI2RlZmluZSBhbGwoeCkgKHgpLmJlZ2luKCksICh4KS5lbmQoKQojZGVmaW5lIHBiIHB1c2hfYmFjawojZGVmaW5lIG1wIG1ha2VfcGFpcgojZGVmaW5lIEZvcihpLCBzdCwgZW4pIGZvcihpbnQgaT0oc3QpOyBpPD0oaW50KShlbik7IGkrKykKI2RlZmluZSBGb3JkKGksIHN0LCBlbikgZm9yKGludCBpPShzdCk7IGk+PShpbnQpKGVuKTsgaS0tKQojZGVmaW5lIGZvcm4oaSwgbikgZm9yKGludCBpPTA7IGk8KGludCkobik7IGkrKykKI2RlZmluZSBmb3JkKGksIG4pIGZvcihpbnQgaT0obiktMTsgaT49MDsgaS0tKQojZGVmaW5lIGZvcmkoaXQsIHgpIGZvciAoX190eXBlb2YoKHgpLmJlZ2luKCkpIGl0ID0gKHgpLmJlZ2luKCk7IGl0ICE9ICh4KS5lbmQoKTsgaXQrKykKI2RlZmluZSBpbih4KSBpbnQgKHgpOyBpbnB1dCgoeCkpOwojZGVmaW5lIHggZmlyc3QKI2RlZmluZSB5IHNlY29uZAojZGVmaW5lIGxlc3MoYSxiKSAoKGEpIDwgKGIpIC0gRVBTKQojZGVmaW5lIG1vcmUoYSxiKSAoKGEpID4gKGIpICsgRVBTKQojZGVmaW5lIGVxKGEsYikgKGZhYnMoKGEpIC0gKGIpKSA8IEVQUykKI2RlZmluZSByZW1heChhLCBiKSAoKGEpID0gKGIpID4gKGEpID8gKGIpIDogKGEpKQojZGVmaW5lIHJlbWluKGEsIGIpICgoYSkgPSAoYikgPCAoYSkgPyAoYikgOiAoYSkpCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnR5cGVkZWYgbG9uZyBkb3VibGUgbGQ7IHRlbXBsYXRlIDxjbGFzcyBfVD4gaW5saW5lIF9UIHNxcihjb25zdCBfVCYgeCkge3JldHVybiB4ICogeDt9IHRlbXBsYXRlIDxjbGFzcyBfVD4gaW5saW5lIHN0cmluZyB0b3N0cihjb25zdCBfVCYgYSkge29zdHJpbmdzdHJlYW0gb3MoIiIpOyBvcyA8PCBhOyByZXR1cm4gb3Muc3RyKCk7fSBjb25zdCBsZCBQSSA9IDMuMTQxNTkyNjUzNTg5NzkzMjM4NDYyNjQzMzgzMjc5NUw7IGNvbnN0IGxkIEVQUyA9IDVlLTEyOyBjaGFyIFRFTVBPUkFSWV9DSEFSOyB0eXBlZGVmIGxvbmcgbG9uZyBsbDsgdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgdWxsOyB0eXBlZGVmIHNldCA8IGludCA+IFNJOyB0eXBlZGVmIHZlY3RvciA8IGludCA+IFZJOyB0eXBlZGVmIHZlY3RvciA8IHZlY3RvciA8IGludCA+ID4gVlZJOyB0eXBlZGVmIG1hcCA8IHN0cmluZywgaW50ID4gTVNJOyB0eXBlZGVmIHBhaXIgPCBpbnQsIGludCA+IFBJSTsgY29uc3QgaW50IElORiA9IDFlOTsgaW5saW5lIHZvaWQgaW5wdXQoaW50ICZhKSB7YSA9IDA7IHdoaWxlICgoKFRFTVBPUkFSWV9DSEFSID0gZ2V0Y2hhcigpKSA+ICc5JyB8fCBURU1QT1JBUllfQ0hBUiA8ICcwJykgJiYgKFRFTVBPUkFSWV9DSEFSICE9ICctJykpe30gY2hhciBuZWcgPSAwOyBpZiAoVEVNUE9SQVJZX0NIQVIgPT0gJy0nKSB7bmVnID0gMTsgVEVNUE9SQVJZX0NIQVIgPSBnZXRjaGFyKCk7fSB3aGlsZSAoVEVNUE9SQVJZX0NIQVIgPD0gJzknICYmIFRFTVBPUkFSWV9DSEFSID49ICcwJykge2EgPSAxMCAqIGEgKyBURU1QT1JBUllfQ0hBUiAtICcwJzsgVEVNUE9SQVJZX0NIQVIgPSBnZXRjaGFyKCk7fSBpZiAobmVnKSBhID0gLWE7fSBpbmxpbmUgdm9pZCBvdXQoaW50IGEpIHtpZiAoIWEpIHB1dGNoYXIoJzAnKTsgaWYgKGEgPCAwKSB7cHV0Y2hhcignLScpOyBhID0gLWE7fSBjaGFyIHNbMTBdOyBpbnQgaTsgZm9yKGkgPSAwOyBhOyArK2kpIHtzW2ldID0gJzAnICsgYSAlIDEwOyBhIC89IDEwO30gZm9yZChqLCBpKSBwdXRjaGFyKHNbal0pO30gaW5saW5lIGludCBueHQoKSB7aW4ocmV0KTsgcmV0dXJuIHJldDt9CgojZGVmaW5lIGJpdChhLCBwb3MpICgoYSA+PiBwb3MpICYgMSkKCnN0cnVjdCBzdGF0ZQp7CiAgICBpbnQgbGVuOwoJc3RhdGUgKiBsaW5rOwoJc3RhdGUgKiBuZXh0WzEwXTsKCWludCBjbnQ7CgljaGFyIGNhbjsKCXN0YXRlKCkKCXsKCQljbnQgPSAwOwoJCWxlbiA9IDA7CgkJbGluayA9IDA7CgkJY2FuID0gLTE7CgkJbWVtc2V0KG5leHQsIDAsIHNpemVvZihuZXh0KSk7Cgl9Cgp9OwoKc3RhdGUgKiByb290OwpzdGF0ZSAqIGxhc3Q7Cgp2b2lkIGluaXRfc2EoKQp7Cglyb290ID0gbmV3IHN0YXRlKCk7CglsYXN0ID0gcm9vdDsKfQoKdmVjdG9yIDxzdGF0ZSAqPiBwb3NbMTUwMDAxXTsKCnZvaWQgZXh0ZW5kX3NhKGludCBjKQp7CglzdGF0ZSAqIGN1ciA9IG5ldyBzdGF0ZSgpOwoJY3VyLT5sZW4gPSBsYXN0LT5sZW4gKyAxOwoJcG9zW2N1ci0+bGVuXS5wYihjdXIpOwoJY3VyLT5jbnQgPSAxOwoJc3RhdGUgKiBwID0gbGFzdDsKCWZvcig7IHAgJiYgIXAtPm5leHRbY107IHAgPSBwLT5saW5rKQoJCXAtPm5leHRbY10gPSBjdXI7CglpZiAoIXApCgkJY3VyLT5saW5rID0gcm9vdDsKCWVsc2UKCXsKCQlzdGF0ZSAqIHEgPSBwLT5uZXh0W2NdOwoJCWlmIChwLT5sZW4gKyAxID09IHEtPmxlbikKCQkJY3VyLT5saW5rID0gcTsKCQllbHNlCgkJewoJCQlzdGF0ZSAqIGNsb25lID0gbmV3IHN0YXRlKCk7CgkJCWNsb25lLT5sZW4gPSBwLT5sZW4gKyAxOwoJCQlwb3NbY2xvbmUtPmxlbl0ucGIoY2xvbmUpOwoJCQltZW1jcHkoY2xvbmUtPm5leHQsIHEtPm5leHQsIHNpemVvZihxLT5uZXh0KSk7CgkJCWNsb25lLT5saW5rID0gcS0+bGluazsKCQkJZm9yKDsgcCAmJiBwLT5uZXh0W2NdID09IHE7IHAgPSBwLT5saW5rKQoJCQkJcC0+bmV4dFtjXSA9IGNsb25lOwoJCQlxLT5saW5rID0gY3VyLT5saW5rID0gY2xvbmU7CgkJfQoJfQoJbGFzdCA9IGN1cjsKfQoKbGwgYmVzdCA9IDA7CnN0YXRlICogYnA7CgpjaGFyIGNhbihzdGF0ZSAqIHYpCnsKCWlmICghdikgcmV0dXJuIDA7CglpZiAodi0+Y2FuICE9IC0xKQoJCXJldHVybiB2LT5jYW47CglyZXR1cm4gdi0+Y2FuID0gY2FuKHYtPmxpbmspOwp9CgppbnQgbWFpbigpCnsKCWluKG4pOyBpbihtKTsKCWludCBhW25dOwoJaW5pdF9zYSgpOwoJZm9ybihpLCBuKQoJewoJCWFbaV0gPSBueHQoKSAtIDE7CgkJZXh0ZW5kX3NhKGFbaV0pOwoJfQoJZm9yKGludCBpID0gbjsgaSA+IDA7IC0taSkKCQlmb3IoaW50IGogPSAwOyBqIDwgKGludClwb3NbaV0uc2l6ZSgpOyArK2opCgkJewoJCQlzdGF0ZSAqIHggPSBwb3NbaV1bal07CgkJCWlmICh4LT5saW5rKSB4LT5saW5rLT5jbnQgKz0geC0+Y250OwoJCQlsbCBjdXIgPSB4LT5sZW4gKiAxTEwgKiB4LT5jbnQ7CgkJCWlmIChjdXIgPiBiZXN0KQoJCQl7CgkJCQliZXN0ID0gY3VyOwoJCQkJYnAgPSB4OwoJCQl9CgkJfQoJYnAtPmNhbiA9IDE7Cgljb3V0IDw8IGJlc3QgPDwgZW5kbDsKCWNvdXQgPDwgYnAtPmxlbiA8PCBlbmRsOwoJc3RhdGUgKiBjdXIgPSByb290OwoJZm9yKGludCBpID0gMDsgaSA8IG47ICsraSkKCXsKCQljdXIgPSBjdXItPm5leHRbYVtpXV07CgkJaWYgKGNhbihjdXIpKQoJCXsKCQkJZm9yKGludCBqID0gMDsgaiA8IGJwLT5sZW47ICsraikKCQkJewoJCQkJaWYgKGopIGNvdXQgPDwgIiAiOwoJCQkJY291dCA8PCBhW2kgLSBicC0+bGVuICsgaiArIDFdICsgMTsKCQkJfQoJCQljb3V0IDw8IGVuZGw7CgkJCXJldHVybiAwOwoJCX0KCX0KCXJldHVybiAwOwoKfQo=