#include <iostream>
#include <cstdio>
#include <vector>
#include <stack>
using namespace std;
int n;
struct treenode{
int f=0;
char c;
int mynum;
}tree[5*100000+1];
vector<char> v1;
void cal(int x)
{
if(tree[x].f==0)
{
v1.push_back(tree[x].c);
return ;
}
cal(tree[x].f);
v1.push_back(tree[x].c);
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>tree[i].c;
}
for(int i=1;i<n;i++)
{
cin>>tree[i+1].f;
tree[i].mynum=i;
}
tree[n].mynum=n;
int ans=0;
int cnt=0;
for(int i=1;i<=n;i++)
{
int ans=0;
v1.clear();
cal(i);
// cout<<i<<endl;
// for(int r=0;r<v1.size();r++)
// {
// cout<<v1[r]<<" ";
// }
// cout<<endl;
for(int t=0;t<v1.size();t++)
{
for(int j=t+1;j<v1.size();j++)
{
stack<char> s;
bool f=0;
for(int k=t;k<=j;k++)
{
if(v1[k]=='(')
{
s.push('(');
}
else
{
if(s.size()==0)
{
f=1;
break;
}
else
{
s.pop();
}
}
}
if(f==0 && s.size()==0)
{
ans++;
}
}
}
cnt^=(i*ans);
}
cout<<cnt;
return 0;
}