#include<fstream>
#include<vector>
using namespace std;
int n,sol,now;
char s[5010];
vector <int> G[5010];
bool viz[5010];

inline void DFS(int x,int y)
{
    viz[x]=true;
	viz[y]=true;
	now++;
    vector <int>::iterator it,jt;
    for(it=G[x].begin();it!=G[x].end();it++)
    {
        if(!viz[*it])
        {
            for(jt=G[y].begin();jt!=G[y].end();jt++)
			{
				if(!viz[*jt])
				{
					if(s[*it]==s[*jt])
						DFS(*it,*jt);
				}
			}
        }
    }
	viz[x]=false;
	viz[y]=false;
}
 
int main()
{
    int i,x,y;
	vector <int>::iterator it,jt;
    ifstream fin("arbpal.in");
    fin>>n;
    for(i=1;i<n;i++)
    {
        fin>>x>>y;
        G[x].push_back(y);
        G[y].push_back(x);
    }
    for(i=1;i<=n;i++)
        fin>>s[i];
    fin.close();
	
    for(i=1;i<=n;i++) 
	{
		sol++; //s[i] va fi centrul unui palindrom de lungime impara
		viz[i]=true;
		for(it=G[i].begin();it!=G[i].end();it++)
		{
			for(jt=G[i].begin();jt!=G[i].end();jt++)
			{
				if(s[*it]==s[*jt] && *it<*jt) //expandez palindromul in stanga si dreapta
				{
					now=0;
					DFS(*it,*jt);
					sol+=2*now; //numar de doua ori (P(x,y) si P(y,x))
				}
			}
		}
		viz[i]=false;
	}
	for(i=1;i<=n;i++)
	{
		for(it=G[i].begin();it!=G[i].end();it++)
		{
			//s[i] si s[*it] vor fi centrul unui palindrom de lungime para
			if(s[i]==s[*it] && i<*it) //expandez palindromul in stanga si dreapta
			{
				now=0;
				DFS(i,*it);
				sol+=2*now; //numar de doua ori (P(x,y) si P(y,x))
			}
		}
	}
     
    ofstream fout("arbpal.out");
    fout<<sol<<"\n";
    fout.close();
    return 0;
}
