#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
struct pair{
int word;
int indexInS;
};
int cmp(const void* a, const void* b) {
return (((struct pair*)a)->indexInS - ((struct pair*)b)->indexInS);
}
// find substring such that the return index % n == 0
char* findSubstringAtN(char* s, char* word, int n) {
int i;
while (1) {
i = 0;
for (i = 0; i < n; ++i)
if (s[i] != word[i]) break;
if (i == n) return s;
// not found
s+=i;
while (*s != '\0' && i < n) {
++s;
++i;
}
if (i != n) return NULL;
}
}
int* findSubstring(char* s, char** words, int wordsSize, int* returnSize) {
int wordLen
= strlen(words
[0]); *returnSize = 0;
int i, j, k, continue_flag;
char* ptr;
struct pair index[wordsSize], temp;
for (i = 0; i < wordLen; ++i) {
//if (start[i] == 0) continue;
char* s1 = s + i;
int skip = 0;
for (j = 0; j < wordsSize && s+i != '\0'; ++j) {
ptr = findSubstringAtN(s1+skip, words[j], wordLen);
printf("%d %d %p ", i
, j
, ptr
); if (ptr) {
index[j].word = j;
index[j].indexInS = ptr - s1;
if (index[j].indexInS == skip) skip += wordLen;
}
else break;
}
if (ptr == NULL) continue;
while (1) {
continue_flag = 0;
qsort(index
, wordsSize
, sizeof(struct pair
), cmp
); for (j = 0; j < wordsSize - 1; ++j) {
for (k = 0; k < wordsSize; ++k)
printf("%d ", index
[k
].
indexInS); // words = ["aa","aa", ...]
if (index[j].indexInS == index[j + 1].indexInS) {
ptr = findSubstringAtN(s1+index[j].indexInS+wordLen, words[index[j].word], wordLen);
if (ptr) {
index[j+1].indexInS = ptr - s1;
temp = index[j + 1];
for (k = j+2; k<wordsSize; ++k) {
if (index[k].indexInS < temp.indexInS)
index[k-1] = index[k];
else break;
}
index[k-1] = temp;
//qsort(index, wordsSize, sizeof(struct pair), cmp);
--j;
continue;
}
else break;
}
if (index[j].indexInS + wordLen != index[j + 1].indexInS) {
ptr = findSubstringAtN(s1+index[0].indexInS+wordLen, words[index[0].word], wordLen);
if (ptr) {
index[0].indexInS = ptr - s1;
temp = index[0];
for (k = 1; k<wordsSize; ++k) {
if (index[k].indexInS < temp.indexInS)
index[k-1] = index[k];
else break;
}
index[k-1] = temp;
if (j == 0) --j;
else j -= 2;
continue;
}
break;
}
}
if (ptr == NULL) break;
//if (continue_flag == 1) continue;
ans[*returnSize] = index[0].indexInS + i;
(*returnSize)++;
// find next concatenated string
ptr = findSubstringAtN(s1+index[wordsSize-1].indexInS+wordLen, words[index[0].word], wordLen);
if (ptr) index[0].indexInS = ptr - s1;
else break; // no more concatenated string
}
}
return ans;
}
int main(void) {
// your code goes here
//char s[] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
char s[] = "b";
char* words[5000];
//for (int i = 0; i < 5000; ++i)
// words[i] = "a";
words[0] = "bbb";
words[1] = "bbb";
words[2] = "a";
words[3] = "c";
words[4] = "a";
words[5] = "a";
words[6] = "a";
words[7] = "b";
words[8] = "c";
int returnSize;
int*a = findSubstring(s, words, 2, &returnSize);
for (int i = 0; i < returnSize; ++i)
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKLyoqCiAqIE5vdGU6IFRoZSByZXR1cm5lZCBhcnJheSBtdXN0IGJlIG1hbGxvY2VkLCBhc3N1bWUgY2FsbGVyIGNhbGxzIGZyZWUoKS4KICovCnN0cnVjdCBwYWlyewogICAgaW50IHdvcmQ7CiAgICBpbnQgaW5kZXhJblM7Cn07CgppbnQgY21wKGNvbnN0IHZvaWQqIGEsIGNvbnN0IHZvaWQqIGIpIHsKICAgIHJldHVybiAoKChzdHJ1Y3QgcGFpciopYSktPmluZGV4SW5TIC0gKChzdHJ1Y3QgcGFpciopYiktPmluZGV4SW5TKTsKfQovLyBmaW5kIHN1YnN0cmluZyBzdWNoIHRoYXQgdGhlIHJldHVybiBpbmRleCAlIG4gPT0gMApjaGFyKiBmaW5kU3Vic3RyaW5nQXROKGNoYXIqIHMsIGNoYXIqIHdvcmQsIGludCBuKSB7CiAgICBpbnQgaTsKICAgIHdoaWxlICgxKSB7CiAgICAgICAgaSA9IDA7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkKICAgICAgICAgICAgaWYgKHNbaV0gIT0gd29yZFtpXSkgYnJlYWs7CiAgICAgICAgaWYgKGkgPT0gbikgcmV0dXJuIHM7CiAgICAgICAgLy8gbm90IGZvdW5kCiAgICAgICAgcys9aTsKICAgICAgICB3aGlsZSAoKnMgIT0gJ1wwJyAmJiBpIDwgbikgewogICAgICAgICAgICArK3M7CiAgICAgICAgICAgICsraTsKICAgICAgICB9CiAgICAgICAgaWYgKGkgIT0gbikgcmV0dXJuIE5VTEw7CiAgICB9Cn0KCmludCogZmluZFN1YnN0cmluZyhjaGFyKiBzLCBjaGFyKiogd29yZHMsIGludCB3b3Jkc1NpemUsIGludCogcmV0dXJuU2l6ZSkgewogICAgaW50IHdvcmRMZW4gPSBzdHJsZW4od29yZHNbMF0pOwogICAgaW50KiBhbnMgPSAoaW50KiltYWxsb2Moc2l6ZW9mKGludCkgKiBzdHJsZW4ocykpOwogICAgKnJldHVyblNpemUgPSAwOwogICAgcHJpbnRmKCIlYyAiLCBzWzBdKTsKCiAgICBpbnQgaSwgaiwgaywgY29udGludWVfZmxhZzsKICAgIGNoYXIqIHB0cjsKCiAgICBzdHJ1Y3QgcGFpciBpbmRleFt3b3Jkc1NpemVdLCB0ZW1wOwogICAgZm9yIChpID0gMDsgaSA8IHdvcmRMZW47ICsraSkgewogICAgICAgIC8vaWYgKHN0YXJ0W2ldID09IDApIGNvbnRpbnVlOwogICAgICAgIGNoYXIqIHMxID0gcyArIGk7CiAgICAgICAgaW50IHNraXAgPSAwOwoKICAgICAgICBmb3IgKGogPSAwOyBqIDwgd29yZHNTaXplICAmJiBzK2kgIT0gJ1wwJzsgKytqKSB7CiAgICAgICAgICAgIHB0ciA9IGZpbmRTdWJzdHJpbmdBdE4oczErc2tpcCwgd29yZHNbal0sIHdvcmRMZW4pOwogICAgICAgICAgICBwcmludGYoIiVkICVkICVwICIsIGksIGosIHB0cik7CiAgICAgICAgICAgIGlmIChwdHIpIHsKICAgICAgICAgICAgICAgIGluZGV4W2pdLndvcmQgPSBqOwogICAgICAgICAgICAgICAgaW5kZXhbal0uaW5kZXhJblMgPSBwdHIgLSBzMTsKICAgICAgICAgICAgICAgIGlmIChpbmRleFtqXS5pbmRleEluUyA9PSBza2lwKSBza2lwICs9IHdvcmRMZW47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBicmVhazsKICAgICAgICB9CiAgICAgICAgaWYgKHB0ciA9PSBOVUxMKSBjb250aW51ZTsKICAgICAgICB3aGlsZSAoMSkgewogICAgICAgICAgICBjb250aW51ZV9mbGFnID0gMDsKICAgICAgICAgICAgcXNvcnQoaW5kZXgsIHdvcmRzU2l6ZSwgc2l6ZW9mKHN0cnVjdCBwYWlyKSwgY21wKTsKICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHdvcmRzU2l6ZSAtIDE7ICsraikgewogICAgICAgICAgICAJZm9yIChrID0gMDsgayA8IHdvcmRzU2l6ZTsgKytrKQogICAgICAgICAgICAJCXByaW50ZigiJWQgIiwgaW5kZXhba10uaW5kZXhJblMpOwogICAgICAgICAgICAJcHJpbnRmKCJcbiIpOwogICAgICAgICAgICAgICAgLy8gd29yZHMgPSBbImFhIiwiYWEiLCAuLi5dCiAgICAgICAgICAgICAgICBpZiAoaW5kZXhbal0uaW5kZXhJblMgPT0gaW5kZXhbaiArIDFdLmluZGV4SW5TKSB7CiAgICAgICAgICAgICAgICAJcHJpbnRmKCIxOiVkXG4iLCBqKTsKICAgICAgICAgICAgICAgICAgICBwdHIgPSBmaW5kU3Vic3RyaW5nQXROKHMxK2luZGV4W2pdLmluZGV4SW5TK3dvcmRMZW4sIHdvcmRzW2luZGV4W2pdLndvcmRdLCB3b3JkTGVuKTsKICAgICAgICAgICAgICAgICAgICBpZiAocHRyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4W2orMV0uaW5kZXhJblMgPSBwdHIgLSBzMTsKICAgICAgICAgICAgICAgICAgICAgICAgdGVtcCA9IGluZGV4W2ogKyAxXTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChrID0gaisyOyBrPHdvcmRzU2l6ZTsgKytrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXhba10uaW5kZXhJblMgPCB0ZW1wLmluZGV4SW5TKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4W2stMV0gPSBpbmRleFtrXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhbay0xXSA9IHRlbXA7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vcXNvcnQoaW5kZXgsIHdvcmRzU2l6ZSwgc2l6ZW9mKHN0cnVjdCBwYWlyKSwgY21wKTsKICAgICAgICAgICAgICAgICAgICAgICAgLS1qOwogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBicmVhazsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoaW5kZXhbal0uaW5kZXhJblMgKyB3b3JkTGVuICE9IGluZGV4W2ogKyAxXS5pbmRleEluUykgewogICAgICAgICAgICAgICAgCXByaW50ZigiMjolZFxuIiwgaik7CiAgICAgICAgICAgICAgICAgICAgcHRyID0gZmluZFN1YnN0cmluZ0F0TihzMStpbmRleFswXS5pbmRleEluUyt3b3JkTGVuLCB3b3Jkc1tpbmRleFswXS53b3JkXSwgd29yZExlbik7CiAgICAgICAgICAgICAgICAgICAgaWYgKHB0cikgewogICAgICAgICAgICAgICAgICAgICAgICBpbmRleFswXS5pbmRleEluUyA9IHB0ciAtIHMxOwogICAgICAgICAgICAgICAgICAgICAgICB0ZW1wID0gaW5kZXhbMF07CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoayA9IDE7IGs8d29yZHNTaXplOyArK2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleFtrXS5pbmRleEluUyA8IHRlbXAuaW5kZXhJblMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhbay0xXSA9IGluZGV4W2tdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpbmRleFtrLTFdID0gdGVtcDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGogPT0gMCkgLS1qOwogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGogLT0gMjsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChwdHIgPT0gTlVMTCkgYnJlYWs7CiAgICAgICAgICAgIC8vaWYgKGNvbnRpbnVlX2ZsYWcgPT0gMSkgY29udGludWU7CiAgICAgICAgICAgIHByaW50Zigib3V0XG4iKTsKICAgICAgICAgICAgYW5zWypyZXR1cm5TaXplXSA9IGluZGV4WzBdLmluZGV4SW5TICsgaTsKICAgICAgICAgICAgKCpyZXR1cm5TaXplKSsrOwogICAgICAgICAgICAvLyBmaW5kIG5leHQgY29uY2F0ZW5hdGVkIHN0cmluZwogICAgICAgICAgICBwdHIgPSBmaW5kU3Vic3RyaW5nQXROKHMxK2luZGV4W3dvcmRzU2l6ZS0xXS5pbmRleEluUyt3b3JkTGVuLCB3b3Jkc1tpbmRleFswXS53b3JkXSwgd29yZExlbik7CiAgICAgICAgICAgIGlmIChwdHIpIGluZGV4WzBdLmluZGV4SW5TID0gcHRyIC0gczE7CiAgICAgICAgICAgIGVsc2UgYnJlYWs7IC8vIG5vIG1vcmUgY29uY2F0ZW5hdGVkIHN0cmluZwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBhbnM7Cn0KCgppbnQgbWFpbih2b2lkKSB7CgkvLyB5b3VyIGNvZGUgZ29lcyBoZXJlCgkvL2NoYXIgc1tdID0gImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhIjsKCWNoYXIgc1tdID0gImIiOwoJY2hhciogd29yZHNbNTAwMF07CgkvL2ZvciAoaW50IGkgPSAwOyBpIDwgNTAwMDsgKytpKQoJLy8Jd29yZHNbaV0gPSAiYSI7Cgl3b3Jkc1swXSA9ICJiYmIiOwoJd29yZHNbMV0gPSAiYmJiIjsKCXdvcmRzWzJdID0gImEiOwoJd29yZHNbM10gPSAiYyI7Cgl3b3Jkc1s0XSA9ICJhIjsKCXdvcmRzWzVdID0gImEiOwoJd29yZHNbNl0gPSAiYSI7Cgl3b3Jkc1s3XSA9ICJiIjsKCXdvcmRzWzhdID0gImMiOwoKCWludCByZXR1cm5TaXplOwoJaW50KmEgPSBmaW5kU3Vic3RyaW5nKHMsIHdvcmRzLCAyLCAmcmV0dXJuU2l6ZSk7CglwcmludGYoIm91dHB1dDoiKTsKCWZvciAoaW50IGkgPSAwOyBpIDwgcmV0dXJuU2l6ZTsgKytpKQoJCXByaW50ZigiJWQgIiwgYVtpXSk7CglyZXR1cm4gMDsKfQo=