#include <iostream>
#include <iomanip>
#include <string>  //funções para objetos string de C++
#include <vector>  //         "           vector   "

#include <cstdlib>

using namespace std;

typedef vector<string> vectStr; //define tipo vetor de strings
typedef vector<char> vectChar;




void split(string, char, vectStr&); //separa sequencias conforme o separador
int pos(string, vectStr);           //localiza a posicao de um elemento em um vetor

void split(string str, char sep, vectStr& v) //separa em substrings de acordo com o separador
{                                      //usa-se template pois v pode ser vetor de string ou de char
    string aux="";

    for(int i=0;i<str.length();i++)
    {
        if(str[i]==sep)
        {
            v.push_back(aux); //adiciona aux ao vetor de strings dinamicamente
            aux="";

        }
        else aux=aux+str[i];
    }
    v.push_back(aux);
}

/*em C
int pos(char a, char *Vet, int tamVet ){
  int i, p;
  for(i=0;i<=tamVet;i++)
     if(a==vet[i]) return i;
  return -1;}



*/
int pos(string a, vectStr C) //verifica se a está no conjunto C
{
    for(int i=0;i<C.size();i++)
        if(a==C[i]) return i; //se achar retorna a posicao

    return -1; //nao achou? retorna -1
}

int main()
{
    vectStr Q,F,aux; //também daria vector<string> Q[TAMANHO], se não fosse dinâmico;
    vectStr Sigma;
    string strAux,s,qs;


    cout<<"Entre com os estados, use virgula para separar: ";
    cin>>strAux;
    split(strAux,',',Q); //separa os Q de acordo com a vírgula,
    //** verificar se os estados não estão repetidos
    for(int i=0;i<Q.size();i++)
    {
        cout<<endl<<Q[i];
    }
    cout<<endl<<"Estado inicial: ";
    cin>>qs;     //***Veja que não estou tratando se qs está em Q (sugestão: utilize a função pos)
    cout<<endl<<"Estados Finais: ";
    cin>>strAux;
    split(strAux,',',F); //***Veja que não estou tratando se F subconjunto de Q (sugestão: utilize a função pos)
    cout<<"Alfabeto: ";
    cin>>strAux;
    split(strAux,',',Sigma);
    //aloca delta dinamicamente
    tabdelta=new string*[Q.size()]; //Q.size() dá o tamanho do vetor, a cada push_back o size() aumenta 1

    //bloco que faz a leitura da tabela da funcao de transicao
    for(int i=0;i<Q.size();i++)
    {
      tabdelta[i]=new string [Sigma.size()];
      for(int j=0;j<Sigma.size();j++)
      {
          cout<<"delta("<<Q[i]<<","<<Sigma[j]<<") = ";
          cin>>tabdelta[i][j];
      }
    }
    //**verificar acima se não entra com estado inexistente
    //**considere "-" como não existência de transição

    //imprime a tabela delta
    for(int i=0;i<Q.size();i++)
        for(int j=0;j<Sigma.size();j++)
        {
            cout<<endl<<"delta("<<Q[i]<<","<<Sigma[j]<<") = "<<tabdelta[i][j]; //endl="\n"
        }

    //Experimente localizar um estao s em Q
    cout<<endl<<"s = ";
    cin>>s;
    cout<<"Posicao "<<pos(s,Q);
    //** lembre-se que delta(s,a)=tabdelta[posicao de s em Q][posicao de a em Sigma]
    //system("pause"); //so usar quando nao estiver no Codeblock
    return 0;
}


//**O PROGRAMA DEVE SEGUIR APROXIMADAMENTE ESTA SEQUENCIA
//faça
//  Leia(Q,Sigma,tabdelta,q0,F);
//  faça
//     Leia(palavra)
//     Verifica se palavra é aceita ou é rejeitada (ESTE ALGORITMO FOI MOSTRADO NA AULA)
//     Escreva("Testar novamente? ")
//     Leia(op)
//  enquanto(op!='N')
//  Escreva("Entrar com outra máquinä?")
//  Leia(op)
//enquanto()
//
