题面传送门

解决思路:

DP 与拓扑结合。\(f_{i,j}\) 表示到 \(i\) 位置 \(j\) 的最大次数。

将 \(a \sim z\) 转成数字 \(0\sim 25\) ,方便存储。

考虑转移。这一部分其他题解讲的很详细了,也很好理解。对于二十六个字母(\(j\)):

  • 若是当前节点,则 \(f_{tmp,j}=\max(f_{tmp,j},f_{k,j}+1)\)

  • 否则 \(f_{tmp,j}=\max(f_{tmp,j},f_{k,j})\)

其中 \(tmp\) 为当前搜到的节点,\(k\) 为其父节点。

然后考虑如何判环。例如以下情况:

红框中显然是环。

模拟其处理过程。第一次删掉了入度为 \(0\) 的 \(1\) 号节点:

然后会发现,这时没有入度为 \(0\) 的节点可以找了,队列为空,结束 BFS。

而对于没有环的情况,所有点都是会被遍历到的。

所以,用 \(cnt\) 记录遍历过点的数量,若最后 \(cnt<n\),则说明有环。

细节讲好了,程序中就不再注释了。

Code:

#include<bits/stdc++.h>
using namespace std;
int n,m,b[300005],in[300005],f[300005][26];
int ans,cnt,x,y;
string s;
vector<int> a[300005];
queue<int> q;
int main(){
scanf("%d%d",&n,&m);
cin>>s;
for(int i=1;i<=n;i++) b[i]=s[i-1]-'a',f[i][b[i]]++;
for(int i=1;i<=m;i++){
scanf("%d%d",&x,&y);
in[y]++;
a[x].push_back(y);
}
for(int i=1;i<=n;i++) if(!in[i]) q.push(i);
while(q.size()){
int k=q.front();
q.pop();
cnt++;
for(int i=0;i<a[k].size();i++){
int tmp=a[k][i];
for(int j=0;j<26;j++){
if(b[tmp]==j) f[tmp][j]=max(f[tmp][j],f[k][j]+1);
else f[tmp][j]=max(f[tmp][j],f[k][j]);
}
in[tmp]--;
if(!in[tmp]) q.push(tmp);
}
}
if(cnt<n) printf("-1");
else{
for(int i=1;i<=n;i++){
for(int j=0;j<26;j++) ans=max(ans,f[i][j]);
}
printf("%d",ans);
}
return 0;
}

最新文章

  1. HDU 5876 (大连网赛1009)(BFS + set)
  2. unity3D里面的点乘和叉乘
  3. Html - 返回Top
  4. C++学习18 派生类的析构函数
  5. Oracle字符编码
  6. Atitit.ALT+TAB没反应车and 点击任务栏程序闪烁可是不能切换
  7. mybatis入门-动态sql
  8. 照着官方文档学习react
  9. Java日志框架那些事儿
  10. Surging微服务的注意事项
  11. 读取gzmt.csv文件,计算均值及概率
  12. Educational Codeforces Round 51 (Rated for Div. 2) G. Distinctification(线段树合并 + 并查集)
  13. 网络扫描信息收集基于(Windows)
  14. C语言数据结构基础学习笔记——基础线性表
  15. python爬虫小试
  16. stegsolve使用探究
  17. Protocol Buffers数据传输及存储协议简单使用
  18. STM32开发(一):简介及开发环境
  19. [Python Study Notes]七彩散点图绘制
  20. Docker | 第二章:第一个Docker应用

热门文章

  1. C# 开发过程中常见错误记录及解决说明
  2. 第六十五篇:Vue的过滤器
  3. 阿里druid-spring-boot-starter 配置,个人整理以及遇到的问题(防止之后找不到)
  4. 用Python实现广度优先搜索
  5. KFS邮件自动告警-数据比对-数据修复配置方法
  6. 采云端&amp;采云链:从订单协同到采购供应链,让采购供应链互联互通
  7. 前端实现docx、pdf格式文件在线预览
  8. 【疑难杂症】关于pytorch安装的一些问题
  9. Containerd 知识点
  10. 使用logstash读取MySQL数据传输到es,并且@timestamp字段采用MySQL中的字段时间--建议采用这个