#include <cassert>
#include <cstdio>
using namespace std;
int count = 0 ;
bool isMatch( const char * s, const char * p) {
printf ( "%5d %s %s\n " , count++ , s, p) ;
assert ( s && p) ;
if ( * p == '\0 ' ) return * s == '\0 ' ;
// next char is not '*': must match current character
if ( * ( p+ 1 ) ! = '*' ) {
assert ( * p ! = '*' ) ;
return ( ( * p == * s) || ( * p == '.' && * s ! = '\0 ' ) ) && isMatch( s+ 1 , p+ 1 ) ;
}
// next char is '*'
while ( ( * p == * s) || ( * p == '.' && * s ! = '\0 ' ) ) {
if ( isMatch( s, p+ 2 ) ) return true ;
s++ ;
}
return isMatch( s, p+ 2 ) ;
}
int main( ) {
isMatch( "aaa" , "a*a*a*b" ) ;
return 0 ;
}
I2luY2x1ZGUgPGNhc3NlcnQ+CiNpbmNsdWRlIDxjc3RkaW8+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgppbnQgY291bnQgPSAwOwoKYm9vbCBpc01hdGNoKGNvbnN0IGNoYXIgKnMsIGNvbnN0IGNoYXIgKnApIHsKCiAgcHJpbnRmKCIlNWQgICAlcyAgICVzXG4iLCBjb3VudCsrLCBzLCBwKTsgIAoKICBhc3NlcnQocyAmJiBwKTsKICBpZiAoKnAgPT0gJ1wwJykgcmV0dXJuICpzID09ICdcMCc7CgogIC8vIG5leHQgY2hhciBpcyBub3QgJyonOiBtdXN0IG1hdGNoIGN1cnJlbnQgY2hhcmFjdGVyCiAgaWYgKCoocCsxKSAhPSAnKicpIHsKICAgIGFzc2VydCgqcCAhPSAnKicpOwogICAgcmV0dXJuICgoKnAgPT0gKnMpIHx8ICgqcCA9PSAnLicgJiYgKnMgIT0gJ1wwJykpICYmIGlzTWF0Y2gocysxLCBwKzEpOwogIH0KICAvLyBuZXh0IGNoYXIgaXMgJyonCiAgd2hpbGUgKCgqcCA9PSAqcykgfHwgKCpwID09ICcuJyAmJiAqcyAhPSAnXDAnKSkgewogICAgaWYgKGlzTWF0Y2gocywgcCsyKSkgcmV0dXJuIHRydWU7CiAgICBzKys7CiAgfQogIHJldHVybiBpc01hdGNoKHMsIHArMik7Cn0KCmludCBtYWluKCkgewogICAgaXNNYXRjaCgiYWFhIiwgImEqYSphKmIiKTsKICAgIHJldHVybiAwOwp9Cg==