#include<iostream>
#include<string>
#include<algorithm>
#include<vector>
#include<iomanip>
#include<math.h>
#include<complex>
#include<queue>
#include<deque>
#include<stack>
#include<map>
#include<set>
#include<bitset>
#include<functional>
#include<assert.h>
#include<numeric>
using namespace std;
#define REP(i,m,n) for(int i=(int)(m) ; i < (int) (n) ; ++i )
#define rep(i,n) REP(i,0,n)
using ll = long long;
const int inf=1e9+7;
const ll longinf=1LL<<60 ;
const ll mod=1e9+7 ;

int mul(string s,int& i);
int bracket(string s,int& i);

int mul(string s,int& i){
	int ret=bracket(s,i);
	while(s[i]=='*'||s[i]=='^'){
		char op=s[i];
		i++;
		int res=bracket(s,i);
		if(op=='*')ret&=res;
		else ret^=res;
	}
	return ret;
}

int bracket(string s,int& i){
	if(s[i]=='1'||s[i]=='0'){
		return int(s[i++]-'0');
	}
	if(s[i]=='-'){
		++i;
		return 1-bracket(s,i);
	}
	i++;
	int ret=mul(s,i);
	i++;
	return ret;
}


int calc(string s){
	int n=16;
	int ans=0;
	rep(i,n){
		string t=s;
		rep(j,s.size()){
			if(t[j]=='a')t[j]='0'+((i>>3)&1);
			if(t[j]=='b')t[j]='0'+((i>>2)&1);
			if(t[j]=='c')t[j]='0'+((i>>1)&1);
			if(t[j]=='d')t[j]='0'+((i>>0)&1);
		}
		int k=0;
		int ret=mul(t,k);
		ans+=ret*(1<<i);
	}
	return ans;
}

vector<string> list;
vector<int> ans(65536,inf);
void add(string s){
	//cout<<s<<endl;
	int res=calc(s);
	if(s.size()>=ans[res])return;
	ans[res]=s.size();
	list.push_back(s);
	int m=list.size();
	rep(i,m-1){
		string t = '('+list[i]+'^'+s+')';
		if(t.size()>16)continue;
		string u= '('+list[i]+'*'+s+')';
		add(t);add(u);
	}
	s='-'+s;
	add(s);
}
int main(){
	add("1");add("0");
	add("a");add("b");add("c");add("d");
	string s;
	while(cin>>s){
		if(s[0]=='.')break;
		int ret=calc(s);
		cout<<ans[ret]<<endl;
	}
	return 0;
}
