
#include <stdio.h>

void printSubstring(char *start, int len) {
    while (len--) {
        putchar(*start);
        start++;
    }
    putchar('\n');
}

char* longestUniqueSubstring(char *s, int *outLen) {
    int lastSeen[256];

    for (int i = 0; i < 256; i++)
        lastSeen[i] = -1;

    char *start = s;
    char *end = s;

    char *bestStart = s;
    int bestLen = 0;

    int index = 0;  // position in string

    while (*end != '\0') {
        unsigned char c = (unsigned char)*end;

        // if character seen inside current window
        if (lastSeen[c] >= start - s) {
            // move start just after previous occurrence
            start = s + lastSeen[c] + 1;
        }

        lastSeen[c] = index;

        int len = (end - start) + 1;
        if (len > bestLen) {
            bestLen = len;
            bestStart = start;
        }

        end++;
        index++;
    }

    *outLen = bestLen;
    return bestStart;
}

int main() {
    char str[] = "abcab p q r pqbcbb";

    int len = 0;
    char *res = longestUniqueSubstring(str, &len);

    printf("Longest substring = ");
    printSubstring(res, len);

    return 0;
}