#include #include #include #define MAXK 64 #define ALFA 26 #define HASH 102400 #define MAXL 102400 static size_t cbuf[MAXK][ALFA]; struct ch { size_t hash; unsigned char val[ALFA]; struct ch *next; }; static struct ch chars[MAXL]; struct hte { struct ch *list; unsigned gen; }; static struct hte table[HASH]; static unsigned gen; static size_t hash_fn (const struct ch *ch) { size_t val, i; val = 0; for (i = 0; i < ALFA; i++) val = (val >> 31) ^ (val << 1) ^ ch->val[i]; return val; } static void hash_clear (void) { gen++; } static int hash_add (struct ch *ch) { struct ch *ht; struct hte *hte; ch->hash = hash_fn (ch); hte = table + ch->hash % HASH; if (hte->gen != gen) { hte->gen = gen; hte->list = NULL; } for (ht = hte->list; ht != NULL; ht = ht->next) { if (ht->hash == ch->hash && memcmp (ht->val, ch->val, sizeof (ht->val)) == 0) return 1; } ch->next = hte->list; hte->list = ch; return 0; } int main (void) { for (;;) { static char orig[MAXL], clean[MAXL]; char *p, *q; unsigned k; size_t i; int c; scanf("%u", &k); while ((c = getchar ()) != '\n') ; if (k == 0) break; hash_clear (); gets(orig); q = clean; for (p = orig; *p != 0; p++) { if (*p >= 'a' && *p <= 'z') *q++ = *p; else if (*p >= 'A' && *p <= 'Z') *q++ = *p - ('A' - 'a'); } *q = 0; for (i = 0; i < ALFA; i++) cbuf[0][i] = 0; for (i = 0; clean[i] != 0; i++) { size_t old, new; old = i % MAXK; new = (i + 1) % MAXK; memcpy (cbuf[new], cbuf[old], sizeof (cbuf[new])); cbuf[new][clean[i] - 'a']++; if (i + 1 >= k) { struct ch *ch; unsigned char j; old = (i + 1 - k) % MAXK; ch = chars + i; for (j = 0; j < ALFA; j++) ch->val[j] = cbuf[new][j] - cbuf[old][j]; if (hash_add (ch) != 0) break; } } q = clean; for (p = orig; *p != 0; p++) { if ((*p >= 'a' && *p <= 'z') || (*p >= 'A' && *p <= 'Z')) { if (q == clean + i) break; q++; } } printf ("%u\n", p - orig); } return 0; }