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 a occurs twice in $S$ as a consecutive subsequence.
  • The score determined by the $2$-nd criterion is $2 \times 10 = 20$ points, because ab occurs twice in $S$ as a consecutive subsequence.
  • The score determined by the $3$-rd criterion is $0 \times (-20) = 0$ points, because ba occurs $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 a occurs $3$ times in $S$ as a consecutive subsequence.
  • The score determined by the $2$-nd criterion is $3 \times 10 = 30$ points, because ab occurs $3$ times in $S$ as a consecutive subsequence.
  • The score determined by the $3$-rd criterion is $0 \times (-20) = 0$ points, because ba occurs $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的更多相关文章

  1. 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的子序列( ...

  2. 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 ...

  3. CF1083B The Fair Nut and String

    题意 给出两个长度为n的01字符串S和T. 选出k个字典序在S和T之间的长度为n的01字符串,使得尽可能多的字符串满足其是所选字符串中至少一个串的前缀. 这是一道思路比较奇怪的类似计数dp的题. 首先 ...

  4. Codeforces Round #526 C - The Fair Nut and String /// 组合递推

    题目大意: 给定原字符序列 找出其中所有子序列满足 1.序列内字符都为a 2.若有两个以上的字符 则相邻两个字符在原序列中两者之间存在字符b 的数量 将整个字符序列用b分开 此时再得到每个b之间a的数 ...

  5. 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 ...

  6. java线程 公平锁 ReentrantLock(boolean fair)

    一.公平锁 1.为什么有公平锁 CPU在调度线程的时候是在等待队列里随机挑选一个线程,由于这种随机性所以是无法保证线程先到先得的(synchronized控制的锁就是这种非公平锁).但这样就会产生饥饿 ...

  7. Fair Scheduler中的Delay Schedule分析

    延迟调度的主要目的是提高数据本地性(data locality),减少数据在网络中的传输.对于那些输入数据不在本地的MapTask,调度器将会延迟调度他们,而把slot分配给那些具备本地性的MapTa ...

  8. BZOJ3540: [Usaco2014 Open]Fair Photography

    3540: [Usaco2014 Open]Fair Photography Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 72  Solved: 29 ...

  9. 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 ...

  10. codeforces 897A Scarborough Fair 暴力签到

    codeforces 897A Scarborough Fair 题目链接: http://codeforces.com/problemset/problem/897/A 思路: 暴力大法好 代码: ...

随机推荐

  1. 【故障公告】多年的故障老朋友又来了:数据库服务器 CPU 100%

    数据库服务器 CPU 100% 问题几乎每年都要来几次,从来都不事先打一声招呼,今年的第2次在我们正忙着会员救园的时候来了. 今天 13:35 首先收到我们自己的异常告警通知: Execution T ...

  2. 【Hexo】NexT 主题的配置使用记录

    目录 简介 版本 安装 配置记录 风格/主题 网页图标 菜单栏 侧边栏 本地搜索 代码块 动画效果 阅读进度 书签 Mermaid lazyload fancybox pangu 捐赠 版权声明 不蒜 ...

  3. 《Linux基础》08. 日志管理 · 备份与恢复

    @ 目录 1:日志管理 1.1:系统常用日志 1.2:日志管理 1.2.1:日志服务 1.2.2:配置文件 1.2.3:自定义日志管理 1.3:日志轮替 1.3.1:轮替服务 1.3.2:配置文件 1 ...

  4. CodeForces 1324F Maximum White Subtree

    题意 给定一棵\(n\)个节点的无根树,每个节点为黑色或者白色,每个点的答案为包含该点的子树(指无根子树)的白色节点数减黑色节点数的最大值 分析 对于无根树的题一般指定某一个点为根,不妨设为\(1\) ...

  5. Hugging News #0904:🤗 登陆 AWS Marketplace

    每一周,我们的同事都会向社区的成员们发布一些关于 Hugging Face 相关的更新,包括我们的产品和平台更新.社区活动.学习资源和内容更新.开源库和模型更新等,我们将其称之为「Hugging Ne ...

  6. SpringBoot拦截器和动态代理有什么区别?

    在 Spring Boot 中,拦截器和动态代理都是用来实现功能增强的,所以在很多时候,有人会认为拦截器的底层是通过动态代理实现的,所以本文就来盘点一下他们两的区别,以及拦截器的底层实现. 1.拦截器 ...

  7. 「codeforces - 1720」

    壹 最近 cq 情况很急急,昨天出去排核酸整了两个半小时,十分无语.提前放假自然是一大好事,但是一个人在家也蛮无聊.不要再涨体重了为好,这一年间他妈 delta 了 10 kilos,算了下 BMI ...

  8. [HNCTF 2022 WEEK2]e@sy_flower

    花指令分析 如果没接触过花指令,先看这个博客,大致了解一下花指令 https://www.cnblogs.com/Here-is-SG/p/15802040.html 点击此处下载附件 查壳 32位, ...

  9. AT 下分记录

    7.30 AGC063 \(+30=1620\) B 做法假 WA 了三次,为啥总是吃了罚时才能发现问题啊 心态还是需要解决的问题.过完 B 啥都想不出来又自闭了

  10. ARM开发板学习

    ARM开发板学习 1.蜂鸣器配饰和时间函数开发 #include <stdio.h> #include <wiringPi.h> #include <unistd.h&g ...