| 13 | int N, sz, last, bestidx, bestlen; |
| 14 | |
| 15 | void extend(char c){ |
| 16 | int cur = sz++; |
| 17 | node[cur].cnt = 1; |
| 18 | node[cur].firstpos = node[last].len; |
| 19 | node[cur].len = node[last].len + 1; |
| 20 | int p = last; |
| 21 | while(p != -1 && !node[p].nxt.count(c)){ |
| 22 | node[p].nxt[c] = cur; |
| 23 | p = node[p].link; |
| 24 | } |
| 25 | if(p == -1){ |
| 26 | node[cur].link = 0; |
| 27 | } else { |
| 28 | int q = node[p].nxt[c]; |
| 29 | if(node[p].len + 1 == node[q].len){ |
| 30 | node[cur].link = q; |
| 31 | } else { |
| 32 | int clone = sz++; |
| 33 | node[clone].len = node[p].len + 1; |
| 34 | node[clone].nxt = node[q].nxt; |
| 35 | node[clone].link = node[q].link; |
| 36 | node[clone].firstpos = node[q].firstpos; |
| 37 | while(p != -1 && node[p].nxt[c] == q){ |
| 38 | node[p].nxt[c] = clone; |
| 39 | p = node[p].link; |
| 40 | } |
| 41 | node[q].link = node[cur].link = clone; |
| 42 | } |
| 43 | } |
| 44 | last = cur; |
| 45 | } |
| 46 | |
| 47 | void init(){ |
| 48 | node[0].len = 0; |