{
k=1-k;
memset(dp[k],-1,sizeof(dp[k]));
for (i=0;i
if (dp[1-k][j][p]!=-1)
{
x=point[need[i]].w|p;
if (dp[k][i][x]==-1 || dp[k][i][x]>dp[1-k][j][p]+arc[j][i])
dp[k][i][x]=dp[1-k][j][p]+arc[j][i];
}
}
ans=oo;
}
int main()
{
while (~scanf("%d",&n))
{
if (!n) break;
Built_Trie();
Built_AC_Automation();
Built_Arc();
printf("%d\n",EXE_DP());
}
return 0;
}