Index: compiler/generator.c
===================================================================
--- compiler/generator.c	(revision 407)
+++ compiler/generator.c	(working copy)
@@ -873,11 +919,53 @@
 static void generate_substring(struct generator * g, struct node * p) {
 
     struct among * x = p->among;
+    symbol block;
+    unsigned int bitmap = 0;
 
     g->S[0] = p->mode == m_forward ? "" : "_b";
     g->I[0] = x->number;
     g->I[1] = x->literalstring_count;
 
+    if (x->literalstring_count) {
+	struct amongvec * among_cases = x->b;
+	if (among_cases[0].size) {
+	    int c;
+	    symbol ch;
+	    if (p->mode == m_forward) {
+		ch = among_cases[0].b[0];
+	    } else {
+		ch = among_cases[0].b[among_cases[0].size - 1];
+	    }
+	    block = (ch >> 5);
+	    bitmap = 1u << (ch & 0x1f);
+	    for (c = 1; c < x->literalstring_count; ++c) {
+		if (among_cases[c].size == 0) {
+		    bitmap = 0;
+		    break;
+		}
+		if (p->mode == m_forward) {
+		    ch = among_cases[c].b[0];
+		} else {
+		    ch = among_cases[c].b[among_cases[c].size - 1];
+		}
+		if (ch >> 5 != block) {
+		    bitmap = 0;
+		    break;
+		}
+		bitmap |= 1u << (ch & 0x1f);
+	    }
+	}
+    }
+
+    if (bitmap) {
+	g->I[2] = block;
+	g->I[3] = bitmap;
+	if (p->mode == m_forward) {
+	    wp(g, "~Mif (z->c == z->l || z->p[z->c] >> 5 != ~I2 || !((~I3 >> (z->p[z->c] & 0x1f)) & 1)) ~f~N", p);
+	} else {
+	    wp(g, "~Mif (z->c <= z->lb || z->p[z->c - 1] >> 5 != ~I2 || !((~I3 >> (z->p[z->c - 1] & 0x1f)) & 1)) ~f~N", p);
+	}
+    }
     if (x->command_count == 0 && x->starter == 0)
         wp(g, "~Mif (!(find_among~S0(z, a_~I0, ~I1))) ~f~C", p);
     else
