#include<cstdio>
#include<stdlib.h>
#include<string.h>
#include<string>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<map>
#include<set>
#include<queue>
#include<vector>
using namespace std;
#define maxno 1000000
#define size 26
#define INF 10000000000000000
long long d[1005];
struct trie
{
int ch[maxno][size];
int val[maxno];
int sz;
void clear()
{ sz=1;
memset(ch[0],0,sizeof(ch[0]));
}
int idx(char x)
{
return x-'A';
}
void insert(char *s,int v)
{
int u=0;
int n=strlen(s);
for(int i=0;i<n;i++)
{
int c=idx(s[i]);
if(!ch[u][c])
{
memset(ch[sz],0,sizeof(ch[sz]));
val[sz]=0;
ch[u][c]=sz++;
}
u=ch[u][c];
}
val[u]=v;
}
int find(char *s,int a,int b)
{
int u=0;
int n=strlen(s);
for(int i=a;i<=a+b;i++)
{ // printf("%c",s[i]);
int c=idx(s[i]);
if(!ch[u][c])
return 0;
u=ch[u][c];
}
return val[u];
}
}h;
int main()
{
// freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
char s[1005],s1[1005];
int v[100005];
int n;
while(scanf("%s",s)!=EOF){
int m=strlen(s);
fill(d,d+m,INF);
h.clear();
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%s%d",s1,&v[i]);
h.insert(s1,v[i]);
}
// for(int i=0;i< 7;i++)
// printf("%d\n",h.val[i]);
d[m]=0;
for(int i=m-1;i>=0;i--)
{
for(int j=0;j<m-i;j++){
int k=h.find(s,i,j);
// printf("%d\n",k);
if(k)
d[i]=min(d[i],k+d[i+1+j]);
}
}
// for(int i=0;i<=m;i++)
if(d[0]==INF)
printf("No\n");
else
printf("Yes %lld\n",d[0]);
}
return 0;
}
1213 trie+DP
最新推荐文章于 2019-06-25 07:23:13 发布