[ABC264G] String Fair
Problem Statement
In a string fair, they determine the beauty of a non-empty string $S$ consisting of lowercase English letters.
The beauty of string $S$ equals the sum of $N$ scores determined by $N$ criteria.
For $i = 1, 2, \ldots, N$, the score determined by the $i$-th criterion is
"the number of occurrences of a string $T_i$ (of length at most $3$ given in the Input) in $S$ as a consecutive subsequence" multiplied by $P_i$.
Print the maximum possible beauty of a non-empty string $S$ consisting of lowercase English letters.
If it is possible to obtain infinitely large beauty, print Infinity instead.
Here, the number of occurrences of a string $V$ in a string $U = U_1U_2\ldots U_{|U|}$ as a consecutive subsequence is defined to be
the number of integers $i$ such that $1 \leq i \leq |U|-|V|+1$ and $U_iU_{i+1}\ldots U_{i+|V|-1} = V$.
Constraints
- $1 \leq N \leq 18278$
- $N$ is an integer.
- $T_i$ is a string of length between $1$ and $3$ consisting of lowercase English letters.
- $i \neq j \Rightarrow T_i \neq T_j$
- $-10^9 \leq P_i \leq 10^9$
- $P_i$ is an integer.
Input
Input is given from Standard Input in the following format:
$N$
$T_1$ $P_1$
$T_2$ $P_2$
$\vdots$
$T_N$ $P_N$
Output
Print the maximum possible beauty of a non-empty string $S$ consisting of lowercase English letters.
If it is possible to obtain infinitely large beauty, print Infinity instead.
Sample Input 1
3
a -5
ab 10
ba -20
Sample Output 1
Infinity
For example, if $S =$ abzabz:
- The score determined by the $1$-st criterion is $2 \times (-5) = -10$ points, because
aoccurs twice in $S$ as a consecutive subsequence. - The score determined by the $2$-nd criterion is $2 \times 10 = 20$ points, because
aboccurs twice in $S$ as a consecutive subsequence. - The score determined by the $3$-rd criterion is $0 \times (-20) = 0$ points, because
baoccurs $0$ times in $S$ as a consecutive subsequence.
Thus, the beauty of $S$ is $(-10) + 20 + 0 = 10$.
As another example, if $S =$ abzabzabz:
- The score determined by the $1$-st criterion is $3 \times (-5) = -15$ points, because
aoccurs $3$ times in $S$ as a consecutive subsequence. - The score determined by the $2$-nd criterion is $3 \times 10 = 30$ points, because
aboccurs $3$ times in $S$ as a consecutive subsequence. - The score determined by the $3$-rd criterion is $0 \times (-20) = 0$ points, because
baoccurs $0$ times in $S$ as a consecutive subsequence.
Thus, the beauty of $S$ is $(-15) + 30 + 0 = 15$.
In general, for a positive integer $X$, if $S$ is a concatenation of $X$ copies of abz, then the beauty of $S$ is $5X$.
Since you can obtain as large beauty as you want, Infinity should be printed.
Sample Input 2
28
a -5
ab 10
ba -20
bb -20
bc -20
bd -20
be -20
bf -20
bg -20
bh -20
bi -20
bj -20
bk -20
bl -20
bm -20
bn -20
bo -20
bp -20
bq -20
br -20
bs -20
bt -20
bu -20
bv -20
bw -20
bx -20
by -20
bz -20
Sample Output 2
5
$S = $ ab achieves the maximum beauty possible.
Sample Input 3
26
a -1
b -1
c -1
d -1
e -1
f -1
g -1
h -1
i -1
j -1
k -1
l -1
m -1
n -1
o -1
p -1
q -1
r -1
s -1
t -1
u -1
v -1
w -1
x -1
y -1
z -1
Sample Output 3
-1
Note that $S$ should be a non-empty string.
只有长度为 3 的串,这是一个重要条件。
考虑一个结尾为 \(s_1s_2\) 的串,那么此时增加一个字符 \(s_3\),那么我们可以轻易计算出会增加多少的权值,然后这个字符串的结尾就变成 \(s_2s_3\)
然后想到了建图。以两个字符作为一个点,从 \(s_1s_2\) 到 \(s_2s_3\) 计算出会增加 \(w\) 权值,然后连一条权值为 \(w\) 的边。这样就代表在串中增加了字符 \(s_3\)。
如果这样连出来的图有正环,答案为 \(\infin\),否则跑一个最长路就行了。
但是我们一开始加入堆两个字符怎么办?可以建一个虚拟节点,连向每个点,边权时这两个字符带来的代价。
有负权边,跑spfa,复杂度 \(26^5\)(边只有 \(26^3\)条)
#include<bits/stdc++.h>
using namespace std;
const int N=2e4+5,M=805;
string str;
char ss[5];
int n,p[N],mp[1000005],v[N],hd[N],e_num,q[N*M],c[N],l,r,cnt[N];
long long ans=-1e18,f[N];
struct edge{
int v,nxt;
long long w;
}e[M*M];
int dfs(int x)
{
v[x]=1;
for(int i=hd[x];i;i=e[i].nxt)
{
if(f[x]+e[i].w>f[e[i].v])
{
f[e[i].v]=f[x]+e[i].w;
if(v[e[i].v]>0||dfs(e[i].v))
return 1;
}
}
v[x]=-1;
return 0;
}
void add_edge(int u,int v,long long w)
{
// if(u==676&&v==77)
// printf("%d %d %d\n",u,v,w);
// if(w>0)
// printf("%c%c%c\n",u/26+'a'-1,u%26+'a',v%26+'a');
e[++e_num]=(edge){v,hd[u],w};
hd[u]=e_num;
}
void spfa(int x)
{
v[q[l=r=1]=x]=1;
while(l<=r)
{
for(int i=hd[q[l]];i;i=e[i].nxt)
{
if(f[e[i].v]<f[q[l]]+e[i].w)
{
f[e[i].v]=f[q[l]]+e[i].w;
cnt[e[i].v]++;
if(cnt[e[i].v]>20000)
{
puts("Infinity");
exit(0);
}
if(!v[e[i].v])
v[e[i].v]=1,q[++r]=e[i].v;
}
}
v[q[l++]]=0;
}
// printf("%d\n",f[27]);
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%s%d",ss,p+i);
int k=strlen(ss);
if(k==1)
mp[ss[0]-'a'+1]=p[i];
else if(k==2)
mp[(ss[0]-'a'+1)*27+ss[1]-'a'+1]=p[i];
else
mp[(ss[0]-'a'+1)*729+(ss[1]-'a'+1)*27+ss[2]-'a'+1]=p[i];
}
for(int i=1;i<=26;i++)
ans=max(ans,mp[i]*1LL);
for(int i=1;i<=26;i++)
{
for(int j=0;j<26;j++)
{
for(int k=0;k<26;k++)
{
add_edge(i*26+j,(j+1)*26+k,1LL*mp[k+1]+mp[(j+1)*27+k+1]+mp[i*729+(j+1)*27+k+1]);
}
}
}
// printf("%d \n",mp[1]);
for(int i=1;i<=26;i++)
{
for(int j=0;j<26;j++)
{
add_edge(0,i*26+j,1LL*mp[j+1]+mp[i]+mp[i*27+j+1]);
}
}
// for(int i=hd[27];i;i=e[i].nxt)
// printf("%c%c %lld\n",e[i].v/26-1+'a',e[i].v%26+'a',e[i].w);
memset(f,-0x7f,sizeof(f));
memset(v,f[0]=0,sizeof(v));
spfa(0);
for(int i=1;i<=26;i++)
for(int j=0;j<26;j++)
ans=max(ans,f[i*26+j]);
// printf("%d\n",f[27]);
printf("%lld",ans);
// for(int i=1;i<=26;i++)
// for(int j=0;j<26;j++)
// if(f[i*26+j])
// printf("%c%c %d\n",i+'a'-1,j+'a',f[i*26+j]);
return 0;
}
[ABC264G] String Fair的更多相关文章
- Codeforces Round #526 (Div. 2) C. The Fair Nut and String
C. The Fair Nut and String 题目链接:https://codeforces.com/contest/1084/problem/C 题意: 给出一个字符串,找出都为a的子序列( ...
- C. The Fair Nut and String 递推分段形dp
C. The Fair Nut and String 递推分段形dp 题意 给出一个字符串选择一个序列\({p_1,p_2...p_k}\)使得 对于任意一个\(p_i\) , \(s[p_i]==a ...
- CF1083B The Fair Nut and String
题意 给出两个长度为n的01字符串S和T. 选出k个字典序在S和T之间的长度为n的01字符串,使得尽可能多的字符串满足其是所选字符串中至少一个串的前缀. 这是一道思路比较奇怪的类似计数dp的题. 首先 ...
- Codeforces Round #526 C - The Fair Nut and String /// 组合递推
题目大意: 给定原字符序列 找出其中所有子序列满足 1.序列内字符都为a 2.若有两个以上的字符 则相邻两个字符在原序列中两者之间存在字符b 的数量 将整个字符序列用b分开 此时再得到每个b之间a的数 ...
- Codeforces CF#628 Education 8 F. Bear and Fair Set
F. Bear and Fair Set time limit per test 2 seconds memory limit per test 256 megabytes input standar ...
- java线程 公平锁 ReentrantLock(boolean fair)
一.公平锁 1.为什么有公平锁 CPU在调度线程的时候是在等待队列里随机挑选一个线程,由于这种随机性所以是无法保证线程先到先得的(synchronized控制的锁就是这种非公平锁).但这样就会产生饥饿 ...
- Fair Scheduler中的Delay Schedule分析
延迟调度的主要目的是提高数据本地性(data locality),减少数据在网络中的传输.对于那些输入数据不在本地的MapTask,调度器将会延迟调度他们,而把slot分配给那些具备本地性的MapTa ...
- BZOJ3540: [Usaco2014 Open]Fair Photography
3540: [Usaco2014 Open]Fair Photography Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 72 Solved: 29 ...
- codeforces 628F. Bear and Fair Set 网络流
题目链接 F. Bear and Fair Set time limit per test 2 seconds memory limit per test 256 megabytes input st ...
- codeforces 897A Scarborough Fair 暴力签到
codeforces 897A Scarborough Fair 题目链接: http://codeforces.com/problemset/problem/897/A 思路: 暴力大法好 代码: ...
随机推荐
- Redis系列19:LRU内存淘汰算法分析
Redis系列1:深刻理解高性能Redis的本质 Redis系列2:数据持久化提高可用性 Redis系列3:高可用之主从架构 Redis系列4:高可用之Sentinel(哨兵模式) Redis系列5: ...
- LeetCode952三部曲之三:再次优化(122ms -> 96ms,超51% -> 超91%)
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本文是<LeetCode952三部曲之 ...
- RK3568开发笔记(六):开发板烧写ubuntu固件(支持mipi屏镜像+支持hdmi屏镜像)
前言 编译了uboot,kernel,buildroot后,可以单独输入固件,也可以整体打包成rootfs进行一次性输入,rootfs直接更新升级这个方式目前也是常用的. 烧写器软件:RKDe ...
- 文盘Rust -- 生命周期问题引发的 static hashmap 锁
2021年上半年,撸了个rust cli开发的框架,基本上把交互模式,子命令提示这些cli该有的常用功能做进去了.项目地址:https://github.com/jiashiwen/interactc ...
- 用OLED屏幕播放视频(1): 项目介绍
下面的系列文章记录了如何使用一块linux开发扳和一块OLED屏幕实现视频的播放: 项目介绍 为OLED屏幕开发I2C驱动 使用cuda编程加速视频处理 这篇文章主要对项目的实现做整体的介绍, 包括硬 ...
- RabbitMQ入门实践
一.概述: 大多应用中,可通过消息服务中间件来提升系统异步通信.扩展解耦能力. 1.消息服务中两个重要概念: 消息代理(message broker)和目的地(destination)当消息发送者发送 ...
- Linux服务器使用Redis作为数据缓存,并用log4j2进行日志记录
前言 个人网站使用Vue作为前端,SpringBoot作为后端,MySQL作为数据库,但前端每次请求都会从MySQL数据库中读取数据,而MySQL数据库的数据是存储于服务器磁盘中,所以响应速度有一定影 ...
- Java 中for循环和foreach循环哪个更快?
摘要:本文由葡萄城技术团队于博客园发布.转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 前言 在Java编程中,循环结构是程序员常用的控制流程,而for循环 ...
- Docker CE
3. 安装Docker CE Docker有两个分支版本:Docker CE和Docker EE,即社区版和企业版.本教程基于CentOS 7安装Docker CE. 执行如下命令,安装Docker的 ...
- 报错Intel MKL FATAL ERROR: Cannot load libmkl_core.so.的一种解决方法
问题 今天上80服务器跑mdistiller的代码时,意外发现torch.numpy都不能用了T_T 以torch为例,出现如下报错情况 以numpy为例,出现如下报错情况 我们先看看报错信息,这个报 ...