题目链接.
#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define inf 3e16
using namespace std;
ll n,m;
char s[60];
ll mp[30][30];
ll cost[30],c1[30],c2[30];
ll f[55][55];
void init()
{
for(int i=1;i<=26;i++)
{
cost[i]=c1[i]=c2[i]=inf;
for(int j=1;j<=26;j++)
{
if(i==j)mp[i][j]=0;
else mp[i][j]=inf;
}
}
}
void floyed()
{
for(int k=1;k<=26;k++)
{
for(int i=1;i<=26;i++)
{
for(int j=1;j<=26;j++)
{
mp[i][j]=min(mp[i][j],mp[i][k]+mp[k][j]);
}
}
}
for(int i=1;i<=26;i++)
{
for(int j=1;j<=26;j++)
{
cost[i]=min(cost[i],cost[j]+mp[i][j]);
cost[i]=min(cost[i],c1[j]+mp[j][i]);
for(int k=1;k<=26;k++)
{
cost[i]=min(cost[i],c1[k]+mp[k][j]+mp[i][j]);
}
}
}
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
init();
cin>>s+1>>m;
n=strlen(s+1);
while(m--)
{
string a;cin>>a;
if(a[0]=='c')
{
char x,y;cin>>x>>y;
ll v;cin>>v;
mp[x-'a'+1][y-'a'+1]=min(mp[x-'a'+1][y-'a'+1],v);
}
else if(a[0]=='a')
{
char x;cin>>x;
ll v;cin>>v;
cost[x-'a'+1]=min(cost[x-'a'+1],v);
c1[x-'a'+1]=min(c1[x-'a'+1],v);
}
else
{
char x;cin>>x;
ll v;cin>>v;
cost[x-'a'+1]=min(cost[x-'a'+1],v);
c2[x-'a'+1]=min(c2[x-'a'+1],v);
}
}
floyed();
for(int len=0;len<=n+10;len++)
{
for(int i=1;i+len<=n;i++)
{
int j=i+len;
f[i][j]=inf;
if(s[i]==s[j])f[i][j]=min(f[i][j],f[i+1][j-1]);
f[i][j]=min(f[i][j],f[i+1][j]+cost[s[i]-'a'+1]);
f[i][j]=min(f[i][j],f[i][j-1]+cost[s[j]-'a'+1]);
for(int k=1;k<=26;k++)
{
f[i][j]=min(f[i][j],f[i+1][j-1]+mp[s[i]-'a'+1][k]+mp[s[j]-'a'+1][k]);
}
}
}
if(f[1][n]>=inf)cout<<"-1\n";
else cout<<f[1][n]<<"\n";
return 0;
}