题意:将一个字符串上的n个字符视作点,给出m条有向边,求图中路径上最长出现的相同字母数。

分析:首先如果这张图中有环,则可以取无限大的字符数,在求拓扑排序的同时可以确定是否存在环。

之后在拓扑排序的结果上分别对26个字母dp求出最大结果,并取最大值(一定要分别对每个字母dp,否则会出现问题)。

#include<bits/stdc++.h>
using namespace std;
const int maxn =3e5+;
int N,M;
vector<int> G[maxn];
vector<int> topo;
int indeg[maxn];
int dp[maxn][];
char str[maxn]; void init()
{
topo.clear();
memset(indeg,,sizeof(indeg));
for(int i=;i<=N;++i) G[i].clear();
} bool circle()
{
int v,u,cnt=;
queue<int> Q;
for(int i=;i<=N;++i){
if(!indeg[i]){
Q.push(i);
cnt++;
}
}
while(!Q.empty()){
v= Q.front(); Q.pop();
topo.push_back(v);
for(int i=;i<G[v].size();++i){
u =G[v][i];
indeg[u]--;
if(!indeg[u]){
Q.push(u);
cnt++;
}
}
}
if(cnt==N) return false;
else return true;
} int solve(int key)
{
memset(dp,,sizeof(dp));
int res=;
int e,v,u;
for(int i =;i<topo.size();++i){
v =topo[i];
e = str[v]-'a';
if(e==key)
dp[v][e]++;
res = max(res,dp[v][key]);
for(int j = ;j<G[v].size();++j){
u = G[v][j];
dp[u][key]= max(dp[u][key],dp[v][key]);
}
}
return res;
} int main()
{
int v,u;
while(~scanf("%d%d",&N,&M)){
init();
scanf("%s",str+);
for(int i=;i<M;++i){
scanf("%d%d",&v,&u);
G[v].push_back(u);
indeg[u]++;
}
if(circle()){
printf("-1\n");
continue;
}
int res=;
for(int i=;i<;++i){
res=max(res,solve(i));
}
printf("%d\n",res);
}
return ;
}

CodeForces - 919D Substring (拓扑排序+dp)的更多相关文章

  1. Codeforces 919D Substring (拓扑排序+树形dp)

    题目:Substring 题意:给你一个有向图, 一共有n个节点 , m条变, 一条路上的价值为这个路上出现过的某个字符最多出现次数, 现求这个最大价值, 如果价值可以无限大就输出-1. 题解:当这个 ...

  2. Codeforces 919D Substring ( 拓扑排序 && DAG上的DP )

    题意 : 给出含有 N 个点 M 条边的图(可能不连通或者包含环),每个点都标有一个小写字母编号,然后问你有没有一条路径使得路径上重复字母个数最多的次数是多少次,例如图上有条路径的顶点标号顺序是  a ...

  3. CodeForces 721C Journey(拓扑排序+DP)

    <题目链接> 题目大意:一个DAG图有n个点,m条边,走过每条边都会花费一定的时间,问你在不超过T时间的条件下,从1到n点最多能够经过几个节点. 解题分析:对这个有向图,我们进行拓扑排序, ...

  4. POJ 3249 拓扑排序+DP

    貌似是道水题.TLE了几次.把所有的输入输出改成scanf 和 printf ,有吧队列改成了数组模拟.然后就AC 了.2333333.... Description: MR.DOG 在找工作的过程中 ...

  5. [NOIP2017]逛公园 最短路+拓扑排序+dp

    题目描述 给出一张 $n$ 个点 $m$ 条边的有向图,边权为非负整数.求满足路径长度小于等于 $1$ 到 $n$ 最短路 $+k$ 的 $1$ 到 $n$ 的路径条数模 $p$ ,如果有无数条则输出 ...

  6. 洛谷P3244 落忆枫音 [HNOI2015] 拓扑排序+dp

    正解:拓扑排序+dp 解题报告: 传送门 我好暴躁昂,,,怎么感觉HNOI每年总有那么几道题题面巨长啊,,,语文不好真是太心痛辣QAQ 所以还是要简述一下题意,,,就是说,本来是有一个DAG,然后后来 ...

  7. 【BZOJ-1194】潘多拉的盒子 拓扑排序 + DP

    1194: [HNOI2006]潘多拉的盒子 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 456  Solved: 215[Submit][Stat ...

  8. 【BZOJ5109】[CodePlus 2017]大吉大利,晚上吃鸡! 最短路+拓扑排序+DP

    [BZOJ5109][CodePlus 2017]大吉大利,晚上吃鸡! Description 最近<绝地求生:大逃杀>风靡全球,皮皮和毛毛也迷上了这款游戏,他们经常组队玩这款游戏.在游戏 ...

  9. bzoj1093[ZJOI2007]最大半连通子图(tarjan+拓扑排序+dp)

    Description 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意两点u,v,存在一条u到v的有向路径或者从v到u ...

随机推荐

  1. 在grub的rescue模式修复linux引导

    今天在windows 10系统收到系统更新通知,没看清楚就手贱点了马上更新.以为只是像那些普通更新一样重启一下更新就完了,万万没想到这个是覆盖更新,也就是说这是一个全新的系统更新而不是系统补丁.在安装 ...

  2. Apple设备中point,磅(pt),pixel的关系与转换,以及iPhone模拟器与真机的长度关系

    查阅了好多资料都没有发现有相关的详细介绍,包括苹果官方文档,也是草草带过.后来是在一个介绍Macbook打印字体的博客中看到的,受到启发. 首先说明苹果设备绘图的长度单位可以认为是point,不是磅( ...

  3. CentOS中Apache虚拟主机(virtualHost)设置在/home目录下的若干问题

    在Ubuntu中安装LAMP是非常简单的意见事情.但是在CentOS中却遇到了很多问题. 首先是CentOS中必须手动配置iptables,把80端口开放出来,不然,是访问不到的,开放80端口在/et ...

  4. CentOS7 minion安装图形化界面&远程桌面

    单用户管理 1.1 实验环境 [root@15b883 ~]# cat /etc/redhat-release CentOS Linux release (Core) [root@15b883 ~]# ...

  5. 笔记:C语言图形基本函数及实例五子棋游戏

    初始化图形界面 int gdriver; int gmode; gdriver = DETECT; initgraph(&gdriver,&gmode,"" ); ...

  6. [越狱开发] theOpenDev配置与搭建碰到的问题

    CodeSign error: code signing is required for product type 'Dynamic Library' in SDK 'iOS 6.1' 如何解决?

  7. IOS开发之自定义键盘

     本文转载至 http://blog.csdn.net/majiakun1/article/details/41242069 实际开发过程中,会有自定义键盘的需求,比如,需要添加一个表情键盘.本文提供 ...

  8. mysql 数据库表名大小写问题

    lower_case_table_names=1 原来Linux下的MySQL默认是区分表名大小写的,通过如下设置,可以让MySQL不区分表名大小写:1.用root登录,修改 /usr/my.cnf: ...

  9. 全面解析JavaScript中“&&”和“||”操作符(总结篇)

    1.||(逻辑或), 从字面上来说,只有前后都是false的时候才返回false,否则返回true. ? 1 2 3 4 alert(true||false); // true alert(false ...

  10. shader练习-vertphone

    Shader "VertPhone" { Properties { _MainTex( "颜色贴图", 2D ) = "white"{} _ ...