萌新求助简单dp
查看原帖
萌新求助简单dp
235926
1kri楼主2020/8/4 08:15
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
struct accept{
	int son[26],fail,nowval,val;
	accept(){
		memset(son,0,sizeof(son));
		fail=nowval=val=0;
		return;
	}
}a[1005];
int num,len,cnt;
int n,tot,nxt[15][1005],val[15][1005],f[15][1005][17005]; 
char t[1005],s[400005];
inline void build(){
	int now=0;
	for (int i=1;i<=len;i++){
		if (a[now].son[t[i]-'a']==0)a[now].son[t[i]-'a']=++cnt;
		now=a[now].son[t[i]-'a'];
	}
	int val;
	scanf("%d",&val);
	a[now].nowval+=val;
	return;
}
int head,tail,q[1005];
inline void build_fail(){
	head=1,tail=0;
	for (int i=0;i<26;i++)
		if (a[0].son[i]!=0)q[++tail]=a[0].son[i];
	while(head<=tail){
		int now=q[head];
		head++;
		for (int i=0;i<26;i++)
			if (a[now].son[i]!=0){
				a[a[now].son[i]].fail=a[a[now].fail].son[i];
				q[++tail]=a[now].son[i];
			}
			else a[now].son[i]=a[a[now].fail].son[i];
	}
	return;
}
inline int max(register int a,register int b){
	return a>b?a:b;
}
inline int dfs(register int now,register int nowa,register int nowb){
	if (f[now][nowa][nowb]!=-1)return f[now][nowa][nowb];
	if (now>tot)return 0;
	if (now==0)return val[0][0]+dfs(now+1,nxt[0][0],nowb);
	register int s=-2e9;
	for (register int i=0;i<14;i++){
		if ((nowb&(1<<i))!=0)continue;
		register int x=a[nowa].son[i];
		if (x<0||x>1000)return 0;
		register int num=a[x].val+val[now][x]+dfs(now+1,nxt[now][x],nowb|(1<<i));
		s=max(s,num);
	}
	return f[now][nowa][nowb]=s;	
}
int main(){
	cin>>num;
	for (int i=1;i<=num;i++){
		scanf("%s",t+1);
		len=strlen(t+1);
		build();
	}
	build_fail();
	for (int i=1;i<=cnt;i++)
		for (int j=i;j;j=a[j].fail)	
			a[i].val+=a[j].nowval;
	scanf("%s",s+1);
	n=strlen(s+1);
	tot=-1;
	for (register int i=0;i<=n;){
		++tot;
		register int k;
		for (register int j=0;j<=cnt;j++){
			register int now=j,nowval=0;
			for (k=i+1;s[k]!='?'&&k<=n;k++){
				now=a[now].son[s[k]-'a'];
				nowval+=a[now].val;
			}
			nxt[tot][j]=now,val[tot][j]=nowval;
		}
		i=k;
	}
	memset(f,-1,sizeof(f));
	cout<<dfs(0,0,0)<<endl;
	return 0;
} 

玄学,第56行错了,#5死循环,删去=a[x].val+val[now][x]+ 就不死循环了,但是检查了数组也没有越界啊OvO

2020/8/4 08:15
加载中...