10分求救
查看原帖
10分求救
511423
jerry1717楼主2023/1/13 14:09
#include<bits/stdc++.h>
using namespace std;
int tot,n,k,trie[300][3],dp[1005][300],fail[310],ans,cnt[310];
char s[20];
void insert(char *s,int l) {
	int p=0;
	for(int i=0; i<l; ++i) {
		int c=s[i]-'A';
		if(trie[p][c]==0)trie[p][c]=++tot;
		p=trie[p][c];
	}
	++cnt[p];	
}
void fail1() {
	int u=0;
	queue<int> q;
	for(int i=0; i<3; ++i) {
		if(trie[0][i]!=0)q.push(trie[0][i]);
	}
	while(!q.empty()) {
		u=q.front();
		q.pop();
		for(int i=0; i<3; ++i) {
			if(trie[u][i]) {
				fail[trie[u][i]]=trie[fail[u]][i];
				q.push(trie[u][i]);
			} else	trie[u][i]=trie[fail[u]][i];
			cnt[u]+=cnt[fail[u]];
		}
	}
}
void acye(int k) {
	memset(dp,0xaf,sizeof(dp));
	for(int i=0;i<=k;i++){
		dp[i][0]=0;
	}
	for(int i=1;i<=k;++i) {
		for(int j=0;j<=tot;++j){
			for(int opt=0;opt<3;++opt){
				dp[i][trie[j][opt]]=max(dp[i-1][j]+cnt[trie[j][opt]],dp[i][trie[j][opt]]);
			}
		}
	}
	for(int i=0; i<=tot; i++)ans=max(ans,dp[k][i]);
	printf("%d",ans);
}
int main() {
	scanf("%d%d",&n,&k);
	while(n--){
		scanf("%s",s);
		insert(s,strlen(s));
	}
	fail1();
	acye(k);
	return 0;
}
2023/1/13 14:09
加载中...