#include <bits/stdc++.h>
#define syosu(x) fixed<<setprecision(x)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> P;
typedef pair<double,double> pdd;
typedef pair<ll,ll> pll;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<double> vd;
typedef vector<vd> vvd;
typedef vector<ll> vl;
typedef vector<vl> vvl;
typedef vector<string> vs;
typedef vector<P> vp;
typedef vector<vp> vvp;
typedef vector<pll> vpll;
typedef pair<int,P> pip;
typedef vector<pip> vip;
const int inf=1<<30;
const ll INF=1ll<<60;
const double pi=acos(-1);
const double eps=1e-9;
const ll mod=1e9+7;
const int dx[4]={0,1,0,-1},dy[4]={1,0,-1,0};

const int M=26,MAX=600,LARGE=10000;
class Analysis{
	public:
	int V,n,id=0,tmp,G[LARGE][M+1];
	bool fin[MAX],FIN[LARGE];
	string s;
	vector<vvi> g;
	stack<int> st;
	map<vi,int> mp;
	int ind=0;
	void Str(int &I){
		while(I<n&&'a'<=s[I]&&s[I]<='z'){
			g[id][s[I]-'a'+1].push_back(id+1);
			g[id+1][0].push_back(id+2);
			id+=2,I++;
		}
	}
	void Fact(int &I){
		if(I>=n) return;
		if(s[I]=='('){
			st.push(id);
			Exp(++I),I++;
			tmp=st.top();st.pop();
		}
		else Str(I);
	}
	void Term(int &I){
		while(I<n){
			while(I<n&&(s[I]=='('||'a'<=s[I]&&s[I]<='z')){
				g[id][0].push_back(id+1);
				id++;
				Fact(I);
			}
			if(s[I]=='*'){
				int u=id-2,v=id;
				if(s[I-1]==')') u=tmp;
				else v--;
				g[u][0].push_back(v);
				g[v][0].push_back(u);
				g[id][0].push_back(id+1);
				id++;I++;
			}
			else if(s[I]=='?'){
				int u=id-2,v=id;
				if(s[I-1]==')') u=tmp;
				else v--;
				g[u][0].push_back(v);
				g[id][0].push_back(id+1);
				id++;I++;
			}
			else break;
		}
	}
	void Exp(int &I){
		Term(I);
		while(I<n){
			if(s[I]=='|'){
				g[st.top()][0].push_back(id+1);
				int ID=id++;
				Term(++I);
				g[ID][0].push_back(id);
				g[id][0].push_back(id+1);
				id++;
			}
			else break;
		}
	}
	void Cons(){
		fill(fin,fin+MAX,0);
		int I=0;
		st.push(1);
		g=vector<vvi>(MAX,vvi(M+1));
		g[0][0].push_back(++id);
		Exp(I);
		fin[id]=1;
		int S[MAX][M+1];
		for(int i=0;i<MAX;i++) for(int j=1;j<=M;j++) S[i][j]=g[i][j].size();
		for(int i=0;i<MAX;i++){
			queue<int> q;
			vi a(MAX);
			a[i]++;
			q.push(i);
			while(!q.empty()){
				int u=q.front();q.pop();
				if(u==id) fin[i]=1;
				if(i!=u){
					for(int j=1;j<=M;j++) for(int k=0;k<S[u][j];k++) g[i][j].push_back(g[u][j][k]);
				}
				for(int v:g[u][0]) if(!a[v]){
					a[v]=1;
					q.push(v);
				}
			}
		}
		for(int i=0;i<MAX;i++) g[i][0].clear();
		for(int i=0;i<MAX;i++) for(int j=0;j<=M;j++){
			vi b=g[i][j];
			sort(b.begin(),b.end());
			b.erase(unique(b.begin(),b.end()),b.end());
			g[i][j]=b;
		}
	}
	void dfs(vi a,int type,int N){
		if(mp.find(a)!=mp.end()) return;
		if(!type){
			for(int i=0;i<MAX;i++) if(fin[i]&&a[i]) FIN[ind]=1;
		}
		else if(a[0]) FIN[ind]++;
		mp[a]=ind;
		ind++;
		for(int i=1;i<=M;i++){
			vi b(N);
			for(int j=0;j<N;j++) for(auto k:g[j][i]) b[k]|=a[j];
			if(b==vi(N)) continue;
			dfs(b,type,N);
			G[mp[a]][i]=mp[b];
		}
	}
	void DFA(){
		fill(FIN,FIN+LARGE,0);
		for(int i=0;i<LARGE;i++) fill(G[i],G[i]+M+1,-1); 
		vi a(MAX);
		a[0]++;
		dfs(a,0,MAX);
	}
	void Min(){
		for(int k=0;k<2;k++){
			int N=ind;
			vector<vvi> rg(N,vvi(M+1)); 
			for(int i=0;i<LARGE;i++) for(int j=0;j<=M;j++) if(G[i][j]!=-1){
				rg[G[i][j]][j].push_back(i);G[i][j]=-1;
			}
			g=rg;
			vi a(N);
			mp.clear();
			for(int i=0;i<N;i++) a[i]=FIN[i];
			fill(FIN,FIN+LARGE,0);
			ind=0;
			dfs(a,1,N);
		}
		V=ind;
	}
	bool Match(string t){
		vi a(MAX);
		a[0]++;
		while(1){
			vi b=a;
			for(int j=0;j<MAX;j++) for(auto k:g[j][0]) b[k]|=a[j];
			if(a==b) break;
			a=b;
		}
		for(int i=0;i<t.size();i++){
			vi b(MAX);
			for(int j=0;j<MAX;j++) for(int k:g[j][t[i]-'a'+1]) b[k]|=a[j];
			a=b;
			while(1){
				vi b=a;
				for(int j=0;j<MAX;j++) for(auto k:g[j][0]) b[k]|=a[j];
				if(a==b) break;
				a=b;
			}
		}
		bool B=0;
		for(int i=0;i<MAX;i++) if(fin[i]) B|=a[i];
		return B;
	}
	bool MATCH(string t){
		int v=0;
		for(int i=0;i<t.size();i++){
			v=G[v][t[i]-'a'+1];
			if(v==-1) return 0;
		}
		return FIN[v];
	}
	void Open(){
		for(int u=0;u<MAX;u++) for(int i=0;i<=M;i++) for(auto v:g[u][i]){
			cout<<u<<' '<<v<<' ';
			if(i) cout<<(char)('a'+i-1)<<endl;
			else cout<<'?'<<endl;
		}
		for(int i=0;i<MAX;i++) cout<<fin[i];
		cout<<endl;
	}
	void OPEN(){
		for(int i=0;i<ind;i++) for(int j=1;j<=M;j++) if(G[i][j]>=0) cout<<i<<' '<<G[i][j]<<' '<<(char)('a'+j-1)<<endl;
		for(int i=0;i<ind;i++) cout<<FIN[i];
		cout<<endl;
	}
	void Func(string s_){
		s=s_;
		n=s.size();
		string t;
		for(int i=0;i<n;i++){
			if(s[i]=='.'){
				t+="(a";
				for(char c='b';c<='z';c++) t+='|',t+=c;
				t+=')';
			}
			else t+=s[i];
		}
		s=t;
		n=t.size();
		Cons();DFA();Min();
	}
};

Analysis A,B;

bool dfs(int u,vi& a){
	bool flag=1;
	for(int i=1;i<=M;i++){
		int v1=A.G[u][i],v2=B.G[u][i];
		if(v1==-1^v2==-1){
			flag=0;
			continue;
		}
		if(v1==-1) continue;
		if(a[v1]==-1){
			a[v1]=v2;
			flag&=dfs(v1,a);
		}
		else if(a[v1]!=v2) flag=0;
	}
	return flag;
}

bool Coincide(string s,string t){
	A.Func(s);B.Func(t);
	vi a(A.V,-1);
	a[0]=0;
	if(A.V!=B.V||!dfs(0,a)) return 0;
	bool flag=1;
	for(int i=0;i<A.V;i++) if(A.FIN[i]!=B.FIN[a[i]]) flag=0;
	return flag;
}

const string t="a?kiha?ba?ra?";
string s;

int main(){
	cin>>s;
	for(int i=0;i<s.size();i++) s[i]=tolower(s[i]);
	A.Func(t);
	if(A.MATCH(s)) cout<<"YES"<<endl;
	else cout<<"NO"<<endl;
}

Measured memory_bytes: 1920