|
----------------------
f[i]=max(f[j]+cost) 字符串j+1...i存在
用字典树优化
---------------------
#include <iostream> #include <cstring> #include <cstdio> #include <vector> using namespace std; char str[11111]; char words[1111][44]; int f[11111]; int _cost; int n; int pot; //用类,或者结构体定义都行 struct trie { int next[26]; int value; int cost; trie() { for(int i=0;i<26;i++) next[i]=0; value=0;//记录是不是一个单词 cost=0; } void init() { memset(next,0,sizeof(next)); value=0; cost=0; } }mmr[333333]; //插入: void insert(int root,char* s,int ct) { int p=root; int k=0; while(s[k]!='\0') { if(!mmr[p].next[s[k]-'a']) { mmr[pot].init(); mmr[p].next[s[k]-'a']=pot++; } p=mmr[p].next[s[k]-'a']; k++; } mmr[p].value=1; mmr[p].cost=ct; } //查找 void find(int root,char* s,int pos) { int p=root; int k=0; while(s[k]!='\0'&&mmr[p].next[s[k]-'a']) { p=mmr[p].next[s[k]-'a']; if (mmr[p].value==1) { f[pos+k+1]=max(f[pos+k+1],f[pos]+mmr[p].cost); } k++; } } int main() { int l; int root; while (~scanf("%d%s",&n,str+1)) { memset(f,-1,sizeof(f)); root=1; mmr[root].init(); pot=2; l=strlen(str+1); for (int i=0;i<n;i++) { scanf("%s",words[i]); scanf("%d",&_cost); insert(root,words[i],_cost); } f[0]=0; for (int i=1;i<=l;i++) { if (f[i-1]!=-1) { find(root,str+i,i-1); } } printf("%d\n",f[l]); } return 0; }