#include #include char s[100010]; int x[26]; char h[400000][27]; int al(char z) { return (z>='A' && z<='Z') ; } char a[26]; int main() { int k,i,j,p,l,mo,m; srand(123437); for (i=0;i<26;i++) x[i]=(97+rand()+rand()+rand()+rand()); while (1) { scanf("%d\n",&k); if (k==0) break; i=0; while(1) { scanf("%c",s+i); if (s[i]=='\n') break; } s[i]=0; mo=strlen(s)*4+105; if (mo>400000-3) mo=400000-3; for (i=0;i='a' && s[i]<='z') s[i]-=-'A'+'a'; i=0;j=0; while (s[i] && (!al(s[i]))) i++; if (s[i]==0) { printf("%d\n",i); continue; } j=i; p=0; l=0; for (m=0;m<26;m++) a[m]=0; while (s[j] && p=26) { l=-1; break; } p=(p+1)%mo; } if (l==-1) break; p=l%mo; while (h[p][0]) p=(p+1)%mo; h[p][0]=1; for (m=0;m<26;m++) h[p][m+1]=a[m]; l-=x[s[i]-'A']; a[s[i]-'A']--; i++; while (s[i] && !al(s[i])) i++; while (s[j] && !al(s[j])) j++; if (s[j]) { a[s[j]-'A']++; l+=x[s[j]-'A']; j++; } } if (!(s[j])) { p=l%mo; while (h[p][0]) { for (m=0;m<26;m++) if (a[m]!=h[p][m+1]) break; if (m>=26) { l=-1; break; } p=(p+1)%mo; } } if (l==-1) j--; printf("%d\n",j); } return 0; }