//Program napisany w C++
#include
#include
using namespace std;
char* tekst = new char[1000000];
char* wzorzec = new char[1000000];
int* KMP;
int dlugosc;
void liczKMP(char* wzorzec, int* KMP, int dlugoscwz){
KMP[1] = 0;
int i = 0 ;
for (int j = 1; j while (i>0 && wzorzec[j+1]!=wzorzec[i+1]) { i = KMP[i]; } if (wzorzec[j+1] == wzorzec[i+1]) i++; KMP[j+1] = i; } } void wypisz(int numer){//wypisuje pozycję na której był wzorzec printf("%d ", numer); } void funkcjaKMP(char* wzorzec, int* KMP, int dlugoscwz){ bool cosznaleziono = false; liczKMP(wzorzec, KMP, dlugoscwz); // cout << "W funkcji funkcjaKMP()"< int j = 0; for (int i = 1; i<=dlugosc; i++){ while ((j>0)&& (wzorzec[j+1]!= tekst[i])){ j = KMP[j]; } if (tekst[i]==wzorzec[j+1]) j++; if (j==dlugoscwz){ cosznaleziono = true; wypisz(i-j+1); j = KMP[j]; //szukamy dalej } } if (!cosznaleziono) printf("BRAK"); else printf(""); } int main (){ printf("Podaj liczbę prób"); char cos; int proby; int dlugoscwz = 0; scanf("%d",&proby); scanf("%c",&cos); //wylapuje znak konca linii for (int j = 0; j dlugoscwz = 0; dlugosc = 0; for (int i = 1; ; i++){ dlugosc++; scanf ("%c", &tekst[i]); if (tekst[i]==''){ //napotyka znak konca linii dlugosc--; break; } } for (int i = 1; ; i++){ dlugoscwz++; scanf("%c", &wzorzec[i]); if (wzorzec[i]==''){ //napotyka znak konca linii dlugoscwz--; break; } } KMP = new int[dlugoscwz+1]; funkcjaKMP(wzorzec, KMP, dlugoscwz); delete[] KMP; } return 0; }