Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <fstream>
- #include <cstring>
- #include <queue>
- #include <algorithm>
- #define nmax 701
- using namespace std;
- ifstream fin("p.in");
- ofstream fout("p.out");
- struct info_stare ///se pastreaza vectorul de stari in care ajunge o anumita stare
- {
- int nr = 0;
- int v_end[nmax];
- };
- struct stare {
- int valoare;
- int valoare_codif;
- };
- info_stare fc_tranz[nmax][nmax]; ///functia de tranzitie
- stare st[nmax]; ///vectorul de stari
- char alfabet[nmax]; ///alfabetul
- int st_fin[nmax]; ///vectorul de stari finale
- int nr_stari, nr_litere, stare_initiala, nr_stari_finale, nr_tranzitii;
- int propr;
- void read() {
- ///CITIM STARILE SI LE CODIFICAM
- int i;
- fin >> nr_stari;
- for (i = 0; i < nr_stari; i++) {
- fin >> st[i].valoare;
- st[i].valoare_codif = i;
- }
- ///CITIM ALFABETUL
- fin >> nr_litere;
- for (i = 0; i < nr_litere; i++)
- fin >> alfabet[i];
- ///CITIM STAREA INITIALA SI O CODIFICAM
- int val_in;
- fin >> val_in;
- for (i = 0; i < nr_stari; i++)
- if (val_in == st[i].valoare) stare_initiala = st[i].valoare_codif;
- ///CITIM VECTORUL DE STARI FINALE SI IL CODIFICAM
- fin >> nr_stari_finale;
- for (i = 0; i < nr_stari_finale; i++) {
- int val;
- fin >> val;
- int j;
- for (j = 0; j < nr_stari; j++)
- if (val == st[j].valoare) st_fin[i] = st[j].valoare_codif;
- }
- ///REALIZAM FUNCTIA DE TRANZITIE
- fin >> nr_tranzitii;
- for (i = 0; i < nr_tranzitii; i++) {
- int stare1, stare2;
- char litera;
- fin >> stare1 >> litera >> stare2;
- int stare1_codif, stare2_codif;
- ///CALCULAM CODIFICARILE STARILOR
- int j;
- for (j = 0; j < nr_stari; j++) {
- if (stare1 == st[j].valoare) stare1_codif = st[j].valoare_codif;
- if (stare2 == st[j].valoare) stare2_codif = st[j].valoare_codif;
- }
- ///INTRODUCEM IN FC DE TRANZITIE DATELE
- if (litera != '.') {
- int ct = fc_tranz[stare1_codif][int(litera - 'a')].nr;
- fc_tranz[stare1_codif][int(litera - 'a')].v_end[ct] = stare2_codif;
- ct++;
- fc_tranz[stare1_codif][int(litera - 'a')].nr = ct;
- } else ///CAZ SPECIAL PT LAMBDA,CARE INTRA PE COLOANA 26
- {
- int ct = fc_tranz[stare1_codif][26].nr;
- fc_tranz[stare1_codif][26].v_end[ct] = stare2_codif;
- ct++;
- fc_tranz[stare1_codif][26].nr = ct;
- }
- }
- }
- ///CALULAM LAMBDA-CLOSURE
- struct st_lambda {
- int num = 0;
- int vec[nmax];
- };
- st_lambda l_clos[nmax];
- void calc_lambda_cosure(int stare) {
- int ct = fc_tranz[stare][26].nr;
- for (int i = 0; i < ct; i++) {
- l_clos[stare].vec[l_clos[stare].num] = fc_tranz[stare][26].v_end[i];
- l_clos[stare].num++;
- calc_lambda_cosure(fc_tranz[stare][26].v_end[i]);
- }
- }
- ///FUNCTIE CARE VERIFICA DACA O STARE stare AJUNGE INTR-O STARE FINALA PRIN INTERMEDIUL LITEREI ch
- bool delta(int stare, char ch) {
- int ct = fc_tranz[stare][int(ch - 'a')].nr;
- int pp = 0;
- for (int i = 0; i < ct; i++) {
- pp = 0;
- int j;
- int val = fc_tranz[stare][int(ch - 'a')].v_end[i];
- for (j = 0; j < nr_stari_finale; j++)
- if (val == st_fin[j]) {
- pp = 1;
- return 1;
- }
- if (!pp) {
- int ct2 = l_clos[val].num;
- for (j = 0; j < ct; j++) {
- int k;
- for (k = 0; k < nr_stari_finale; k++)
- if (l_clos[val].vec[j] == st_fin[k]) return 1;
- }
- }
- }
- return 0;
- }
- struct pereche {
- int str;
- char cuv[nmax];
- };
- void delta_tilda(int st_in, char s[]) {
- queue < pereche > C;
- pereche per;
- per.str = st_in;
- strcpy(per.cuv, s);
- C.push(per);
- while (!C.empty()) {
- per = C.front();
- //fout << per.str << " " << per.cuv << " ";
- if (strlen(per.cuv) == 1) {
- if (delta(per.str, per.cuv[0]) == 1) {
- propr = 1;
- return;
- }
- C.pop();
- }
- else {
- C.pop();
- int st = per.str;
- char ch = per.cuv[0];
- int ct = fc_tranz[st][int(ch - 'a')].nr;
- //fout << ct << "\n";
- int i;
- char sir[nmax];
- strcpy(sir, per.cuv);
- for (i = 0; i < ct; i++) {
- int val = fc_tranz[st][int(ch - 'a')].v_end[i];
- pereche pr2;
- pr2.str = val;
- strcpy(pr2.cuv, sir + 1);
- C.push(pr2);
- }
- if (ct == 0) ///DACA NU PLEACA LITERA POTRIVITA VOM MERGE MAI DEPARTE CU LAMBDA
- {
- int ct2 = fc_tranz[st][26].nr;
- for (i = 0; i < ct2; i++) {
- int val2 = fc_tranz[st][26].v_end[i];
- pereche pr2;
- pr2.str = val2;
- strcpy(pr2.cuv, sir);
- C.push(pr2);
- }
- }
- }
- }
- }
- int main() {
- read();
- int i, j;
- for (j = 0; j < nr_stari; j++) ///calculam lambda-cosure pt fiecare nod
- calc_lambda_cosure(j);
- int numar;
- fin >> numar;
- char str[nmax];
- for (i = 0; i < numar; i++) {
- propr = 0;
- fin >> str;
- delta_tilda(stare_initiala, str);
- if (propr == 0) fout << "NU";
- else fout << "DA";
- fout << "\n";
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement