1213 trie+DP

来源:互联网 发布:网络远程教育报考 编辑:程序博客网 时间:2024/05/18 12:42
#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 10000000000000000long 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;}

0 0
原创粉丝点击