首页 > 其他分享 >SP10502 VIDEO - Video game combos 题解

SP10502 VIDEO - Video game combos 题解

时间:2024-08-25 09:36:57浏览次数:9  
标签:combos int 题解 sum long char game define 1000

题目传送门

前置知识

AC 自动机

解法

多模式串匹配考虑 AC 自动机。

令 \(f_{i,j}\) 表示前 \(i\) 个字符,当前运行到 AC 自动机的状态 \(j\) 时的最大得分。状态转移方程为 \(f_{i,k}=\max\limits_{k \in Son(j)} \{ f_{i-1,j}+sum_{k} \}\),其中 \(sum_{k}\) 表示 fail 树上以 \(k\) 结尾的字符串个数。

最终,有 \(\max\limits_{i=0}^{tot} \{ f_{m,i} \}\) 即为所求。

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long 
#define ull unsigned long long
#define sort stable_sort 
#define endl '\n'
int trie[1000][5],fail[1000],sum[1000],f[2000][1000],tot=0;
char s[1000];
int val(char x)
{
	return x-'A'+1;
}
void insert(char s[],int len)
{
	int x=0,i;
	for(i=1;i<=len;i++)
	{
		if(trie[x][val(s[i])]==0)
		{
			tot++;
			trie[x][val(s[i])]=tot;
		}
		x=trie[x][val(s[i])];
	}
	sum[x]++;
}
void build()
{
	int x,i;
	queue<int>q;
	for(i=1;i<=3;i++)
	{
		if(trie[0][i]!=0)
		{
			fail[trie[0][i]]=0;
			q.push(trie[0][i]);
		}
	}
	while(q.empty()==0)
	{
		x=q.front();
		q.pop();
		for(i=1;i<=3;i++)
		{
			if(trie[x][i]==0)
			{
				trie[x][i]=trie[fail[x]][i];
			}
			else
			{
				fail[trie[x][i]]=trie[fail[x]][i];
				sum[trie[x][i]]+=sum[fail[trie[x][i]]];
				q.push(trie[x][i]);
			}
		}
	}
}
int main()
{
	int n,m,ans=0,i,j,k;
	cin>>n>>m;
	memset(f,-0x3f,sizeof(f));
	for(i=1;i<=n;i++)
	{
		cin>>(s+1);
		insert(s,strlen(s+1));
	}
	build();
	f[0][0]=0;
	for(i=1;i<=m;i++)
	{
		for(j=0;j<=tot;j++)
		{
			if(f[i-1][j]>=0)
			{
				for(k=1;k<=3;k++)
				{
					f[i][trie[j][k]]=max(f[i][trie[j][k]],f[i-1][j]+sum[trie[j][k]]);
				}
			}
		}
	}
	for(i=0;i<=tot;i++)
	{
		ans=max(ans,f[m][i]);
	}
	cout<<ans<<endl;
	return 0;
}	

后记

多倍经验:luogu P3041 [USACO12JAN] Video Game G

标签:combos,int,题解,sum,long,char,game,define,1000
From: https://www.cnblogs.com/The-Shadow-Dragon/p/18378676

相关文章

  • 历年CSP-J初赛真题解析 | 2015年CSP-J初赛阅读程序(23-26)
    学习C++从娃娃抓起!记录下CSP-J备考学习过程中的题目,记录每一个瞬间。附上汇总贴:历年CSP-J初赛真题解析|汇总_热爱编程的通信人的博客-CSDN博客#include<iostream>usingnamespacestd;intmain(){inta,b,c;a=1;b=2;c=3;if(a>b){......
  • gameobject_template | gameobject_template_addon
    目录gameobject_templateentrytypedisplayIdIconNameContentTuningIdAINamegameobject_template_addon factionflagsgameobject_templateentry gameobject模板的IDtype gameobject模板类型,取值参考源码GameObjectData.h的structGameObjectTemplat......
  • abc368 题解
    切了ABCDF,G赛后1min切了(恼比赛链接:https://atcoder.jp/contests/abc368A-Cut题意:给定一个长度为\(n\)的序列,先输出后\(k\)个数,在输出前\(n-k\)个数。思路:按题意模拟即可。代码:https://atcoder.jp/contests/abc368/submissions/57030066B-Decrease2maxel......
  • CF241B Friends 题解
    是异或粽子的超级加强版,但是本题因为\(m\)很大,不能套用那一题的解法。换一种思路:考虑把\(a_i\)从高位到低位插入0-1Trie之后,二分第\(m\)大,通过第\(m\)大求答案。对于二分的一个值\(x\),枚举每个位置\(i\),在0-1Trie上找与\(a_i\)异或值大于等于\(x\)的值的......
  • qoj8546题解补充
    题解中第二种解法并没有具体解释是如何归纳的(害笔者想了两天两夜),这里给一个证明。考虑答案为(n,n)时,只需要全取max即可,接下来我们从n往n-1归纳,接下来所有位置初始都是取max的情况1:a中的n和b中的n在同一个位置上,我们只需在这个位置上取min即可归纳到n-1,那么接下来我们钦定不会......
  • P7515 [省选联考 2021 A 卷] 矩阵游戏 题解
    DescriptionAlice有一个\(n\timesm\)的矩阵\(a_{i,j}\)(\(1\lei\len\),\(1\lej\lem\)),其每个元素为大小不超过\({10}^6\)的非负整数。Bob根据该矩阵生成了一个\((n-1)\times(m-1)\)的矩阵\(b_{i,j}\)(\(1\lei\len-1\),\(1\lej\lem-1\)),每个......
  • VS2022 Visual Studio Installer 一直卡在0%,或者下载速度慢的问题解决办法
    C:\Users\Administrator\AppData\Local\Temp到c盘查看日志,发现是下载一个叫vs_installer.opc的东西失败了, 直接复制日志里的https://aka.ms/vs/17/release/installer,下载,发现成功下载,然后放到installer安装器同级目录,重新打开setup安装,就成功了打开了,然后会一直正在准备中,......
  • P10933 创世纪 题解
    题目传送门前置知识树形DP解法将\(a_{i}\)向\(i\)连一条有向边,这样就形成了基环外向树森林。设\(f_{x,0/1}\)表示\(x\)不选/选时,以\(x\)为根的子树的最多选择个数,状态转移方程为\(\begin{cases}f_{x,0}=\sum\limits_{y\inSon(x)}\max(f_{y,0},f_{y,1})\\f_......
  • P10957 环路运输 题解
    题目传送门前置知识单调队列/单调栈优化解法在仓库\(1\)和\(n\)之间把环断开,然后复制一倍接在末尾,形成长度为\(2n\)的直线公路,即有\(a_{i}=a_{i+n}(1\lei\len)\)。对于原来环形公路上的任意两座仓库\(i,j(1\lej<i\len)\),代价为\(\begin{cases}a_{i}+a_{j}......
  • Chain Contestant 题解
    前言题目链接:洛谷;AtCoder。最慢的点才跑\(2\)ms的题解确定不看一看?题意简述给定长度为\(n\)的字符串\(s\),其中\(s_i\in\Omega\),求有多少子序列\(T\)满足任意\(x\in\Omega\),其在\(T\)出现的位置为连续一段,当然,对\(998244353\)取模。\(n\leq10^5\),\(|\Omeg......