#include <stdio.h>
#include <stdlib.h>
#define true 1
#define false 0
struct node_st{
char c;
struct node_st *next;
struct node_st *prev;
struct node_st *jump;
}typedef node_st;
struct head_st{
node_st *first;
node_st *last;
}typedef head_st;
void Add(char c, head_st *h);
void SetJump(head_st *h);
int Check(head_st *h, char *S);
void FreeH(head_st *h);
int main(void){
int T;
char *L, *S;
head_st *head;
head
= (head_st
*)malloc(sizeof(head_st
));
for(int j=0; j<T; j++){
head->first=NULL, head->last=NULL;
for(int i=0; L[i] != '\0'; i++){
Add(L[i], head);
}
SetJump(head);
if(Check(head,S) == true)
else
FreeH(head);
}
return 0;
}
void Add(char c, head_st *h){
node_st *node, *aux;
//remover ? e * desnecessarios
if(h->last != NULL){
if(c == '?' && h->last->c == '*')
return;
else if(c == '*'){
aux = h->last;
while(aux != NULL && (aux->c == '?' || aux->c == '*'))
aux = aux->prev;
h->last=aux;
if(aux == NULL)
h->first = NULL;
}
}
node
= (node_st
*)malloc(sizeof(node_st
));
node->c = c;
node->jump = NULL;
node->next = NULL;
node->prev = h->last;
if(h->first != NULL)
h->last->next = node;
else
h->first = node;
h->last = node;
}
void SetJump(head_st *h){
node_st *node, *jmp=NULL;
char c='-';
node = h->last;
while(node != NULL){
if(node->c == '*' || node->c == '?')
node->jump = jmp;
else
jmp = node;
node = node->prev;
}
}
int Check(head_st *h, char *S){
node_st *node, *nodeRet;
int i=0, indRet;
nodeRet = NULL;
node = h->first;
while(node != NULL && S[i] != '\0'){
//printf("1 - L: %c | S: %c\n",node->c,S[i]);
if(node->c == '?'){
if(node->jump != NULL && S[i] == node->jump->c){
nodeRet = node->next;
indRet = ++i;
node = node->jump->next;
}
else{
node = node->next;
i++;
}
}
else if(node->c == '*'){
nodeRet = node;
if(node->next == NULL){
return true;
}
else if(node->jump != NULL && S[i] == node->jump->c){
node = node->jump->next;
}
else{
node = node->next;
}
indRet = ++i;
}
else{
if(node->c != S[i])
if(nodeRet == NULL)
return false;
else{
node = nodeRet;
i = indRet;
nodeRet = NULL;
}
else{
node = node->next;
i++;
}
}
if(node == NULL && S[i] != '\0'){
if(nodeRet == NULL)
return false;
else{
node = nodeRet;
i = indRet;
nodeRet = NULL;
}
}
}
while(node != NULL && (node->c == '*' || node->c == '?'))
node = node->next;
if(node == NULL && S[i] == '\0') return true;
else return false;
}
void FreeH(head_st *h){
node_st *aux, *aux2;
aux = h->first;
while(aux!=NULL){
aux2=aux->next;
aux=aux2;
}
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCiNkZWZpbmUgdHJ1ZSAxCiNkZWZpbmUgZmFsc2UgMAoKc3RydWN0IG5vZGVfc3R7CgljaGFyIGM7CglzdHJ1Y3Qgbm9kZV9zdCAqbmV4dDsKCXN0cnVjdCBub2RlX3N0ICpwcmV2OwoJc3RydWN0IG5vZGVfc3QgKmp1bXA7Cn10eXBlZGVmIG5vZGVfc3Q7CgpzdHJ1Y3QgaGVhZF9zdHsKCW5vZGVfc3QgKmZpcnN0OwoJbm9kZV9zdCAqbGFzdDsKfXR5cGVkZWYgaGVhZF9zdDsKCnZvaWQgQWRkKGNoYXIgYywgaGVhZF9zdCAqaCk7CnZvaWQgU2V0SnVtcChoZWFkX3N0ICpoKTsKaW50IENoZWNrKGhlYWRfc3QgKmgsIGNoYXIgKlMpOwp2b2lkIEZyZWVIKGhlYWRfc3QgKmgpOwoKaW50IG1haW4odm9pZCl7CglpbnQgVDsKCWNoYXIgKkwsICpTOwoJaGVhZF9zdCAqaGVhZDsKCgloZWFkID0gKGhlYWRfc3QqKW1hbGxvYyhzaXplb2YoaGVhZF9zdCkpOwoKCXNjYW5mKCIlZCIsICZUKTsKCWZvcihpbnQgaj0wOyBqPFQ7IGorKyl7CgkJaGVhZC0+Zmlyc3Q9TlVMTCwgaGVhZC0+bGFzdD1OVUxMOwoKCQlzY2FuZigiJW1zIiwgJkwpOwoJCXNjYW5mKCIlbXMiLCAmUyk7CgoJCWZvcihpbnQgaT0wOyBMW2ldICE9ICdcMCc7IGkrKyl7CgkJCUFkZChMW2ldLCBoZWFkKTsKCQl9CgoJCVNldEp1bXAoaGVhZCk7CgoJCWlmKENoZWNrKGhlYWQsUykgPT0gdHJ1ZSkKCQkJcHJpbnRmKCJZZXNcbiIpOwoJCWVsc2UKCQkJcHJpbnRmKCJOb1xuIik7CgoJCUZyZWVIKGhlYWQpOwoJCWZyZWUoUyk7CgkJZnJlZShMKTsKCX0KCglmcmVlKGhlYWQpOwogICAgCglyZXR1cm4gMDsKfQoKdm9pZCBBZGQoY2hhciBjLCBoZWFkX3N0ICpoKXsKCW5vZGVfc3QgKm5vZGUsICphdXg7CgoJLy9yZW1vdmVyID8gZSAqIGRlc25lY2Vzc2FyaW9zCglpZihoLT5sYXN0ICE9IE5VTEwpewoJCWlmKGMgPT0gJz8nICYmIGgtPmxhc3QtPmMgPT0gJyonKQoJCQlyZXR1cm47CgkJZWxzZSBpZihjID09ICcqJyl7CgkJCWF1eCA9IGgtPmxhc3Q7CgkJCXdoaWxlKGF1eCAhPSBOVUxMICYmIChhdXgtPmMgPT0gJz8nIHx8IGF1eC0+YyA9PSAnKicpKQoJCQkJYXV4ID0gYXV4LT5wcmV2OwoJCQloLT5sYXN0PWF1eDsKCgkJCWlmKGF1eCA9PSBOVUxMKQoJCQkJaC0+Zmlyc3QgPSBOVUxMOwoJCX0KCX0KCglub2RlID0gKG5vZGVfc3QqKW1hbGxvYyhzaXplb2Yobm9kZV9zdCkpOwoJCglub2RlLT5jID0gYzsKCW5vZGUtPmp1bXAgPSBOVUxMOwoJbm9kZS0+bmV4dCA9IE5VTEw7Cglub2RlLT5wcmV2ID0gaC0+bGFzdDsKCQoJaWYoaC0+Zmlyc3QgIT0gTlVMTCkKCSAgICAgICAJaC0+bGFzdC0+bmV4dCA9IG5vZGU7CgllbHNlCgkJaC0+Zmlyc3QgPSBub2RlOwoKCWgtPmxhc3QgPSBub2RlOwp9Cgp2b2lkIFNldEp1bXAoaGVhZF9zdCAqaCl7Cglub2RlX3N0ICpub2RlLCAqam1wPU5VTEw7CgljaGFyIGM9Jy0nOwoJCglub2RlID0gaC0+bGFzdDsKCgl3aGlsZShub2RlICE9IE5VTEwpewoJCWlmKG5vZGUtPmMgPT0gJyonIHx8IG5vZGUtPmMgPT0gJz8nKQoJCQlub2RlLT5qdW1wID0gam1wOwoJCWVsc2UKCQkJam1wID0gbm9kZTsKCgkJbm9kZSA9IG5vZGUtPnByZXY7Cgl9Cn0KCmludCBDaGVjayhoZWFkX3N0ICpoLCBjaGFyICpTKXsKCW5vZGVfc3QgKm5vZGUsICpub2RlUmV0OwoJaW50IGk9MCwgaW5kUmV0OwoKCW5vZGVSZXQgPSBOVUxMOwoJbm9kZSA9IGgtPmZpcnN0OwoKCXdoaWxlKG5vZGUgIT0gTlVMTCAmJiBTW2ldICE9ICdcMCcpewoJCS8vcHJpbnRmKCIxIC0gTDogJWMgfCBTOiAlY1xuIixub2RlLT5jLFNbaV0pOwoJCWlmKG5vZGUtPmMgPT0gJz8nKXsKCQkJaWYobm9kZS0+anVtcCAhPSBOVUxMICYmIFNbaV0gPT0gbm9kZS0+anVtcC0+Yyl7CgkJCQlub2RlUmV0ID0gbm9kZS0+bmV4dDsKCQkJCWluZFJldCA9ICsraTsKCQkJCW5vZGUgPSBub2RlLT5qdW1wLT5uZXh0OwoJCQl9CgkJCWVsc2V7CgkJCQlub2RlID0gbm9kZS0+bmV4dDsKCQkJCWkrKzsKCQkJfQoKCQl9CgkJZWxzZSBpZihub2RlLT5jID09ICcqJyl7CgkJCW5vZGVSZXQgPSBub2RlOwoJCQlpZihub2RlLT5uZXh0ID09IE5VTEwpewoJCQkJcmV0dXJuIHRydWU7CgkJCX0KCQkJZWxzZSBpZihub2RlLT5qdW1wICE9IE5VTEwgJiYgU1tpXSA9PSBub2RlLT5qdW1wLT5jKXsKCQkJCW5vZGUgPSBub2RlLT5qdW1wLT5uZXh0OwoJCQl9CgkJCWVsc2V7CgkJCQlub2RlID0gbm9kZS0+bmV4dDsKCQkJfQoJCQlpbmRSZXQgPSArK2k7CgkJfQoJCWVsc2V7CgkJCWlmKG5vZGUtPmMgIT0gU1tpXSkKCQkJCWlmKG5vZGVSZXQgPT0gTlVMTCkKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQllbHNlewoJCQkJCW5vZGUgPSBub2RlUmV0OwoJCQkJCWkgPSBpbmRSZXQ7CgkJCQkJbm9kZVJldCA9IE5VTEw7CgkJCQl9CgkJCWVsc2V7CgkJCQlub2RlID0gbm9kZS0+bmV4dDsKCQkJCWkrKzsKCQkJfQoJCX0KCgkJaWYobm9kZSA9PSBOVUxMICYmIFNbaV0gIT0gJ1wwJyl7CgkJCWlmKG5vZGVSZXQgPT0gTlVMTCkKCQkJCXJldHVybiBmYWxzZTsKCQkJZWxzZXsKCQkJCW5vZGUgPSBub2RlUmV0OwoJCQkJaSA9IGluZFJldDsKCQkJCW5vZGVSZXQgPSBOVUxMOwoJCQl9CgkJfQoJfQoKCXdoaWxlKG5vZGUgIT0gTlVMTCAmJiAobm9kZS0+YyA9PSAnKicgfHwgbm9kZS0+YyA9PSAnPycpKQoJCW5vZGUgPSBub2RlLT5uZXh0OwoKCWlmKG5vZGUgPT0gTlVMTCAmJiBTW2ldID09ICdcMCcpIHJldHVybiB0cnVlOwoJZWxzZSByZXR1cm4gZmFsc2U7Cn0KCnZvaWQgRnJlZUgoaGVhZF9zdCAqaCl7Cglub2RlX3N0ICphdXgsICphdXgyOwoKCWF1eCA9IGgtPmZpcnN0OwoJd2hpbGUoYXV4IT1OVUxMKXsKCQlhdXgyPWF1eC0+bmV4dDsKCQlmcmVlKGF1eCk7CgkJYXV4PWF1eDI7Cgl9Cgp9Cg==