// Acha posicoes de uma seq. curta dentro de uma longa // // curta = argv // longa = arquivo cin // // Usage: posicao curta class Buffer { int i; char *vector; int len; public: // inicializador Buffer(int size) { i = 0; len = size; vector = new char[len]; // deveria testar return code aqui } // adiciona um carater ao buffer circular void put(int c) { vector[i] = c; i++; if (i >= len) i = 0; } // compara buffer com string dada bool equal (char *string) { int j = i; // para percorrer buffer int k = 0; // para percorrer string do { if (vector[j] != string[k]) { return false; } else { k++; j++; if (j >= len) { j = 0; } } } while (j != i); return true; } }; //-------------------------------------------------- // Main program main(int argc, char *argv[]) { if (argc != 2) { cerr << "Usage: " << argv[0] << " curta < longa\n"; return 0; } char *curta = argv[1]; int clen = strlen(curta); char c; // caracter lido int pos = 1-clen; // posicao a reportar Buffer buffer(clen); // guarda ultimos clen lidos while (cin >> c) { buffer.put(c); pos++; if (pos >= 1 && buffer.equal(curta)) { cout << pos << "\n"; } } return 0; }