Codeforces 919D Substring (拓扑图DP)

手动博客搬家: 本文发表于20180716 10:53:12, 原地址https://blog.csdn.net/suncongbo/article/details/81061500

给定一个\(n\)个点\(m\)条边的有向图(不一定无环),每个点上有一个小写字母。要找一条路径,使得路径上出现次数最多的字母出现的次数最多。如果答案为无穷大输出-1.
题解:何时无穷大?有环的时候可以不停地走环,统计无限次答案,答案为无穷大。因此,对于-1的情况,只需要判一下环即可。
对于有限大的情况,令\(dp[i][c]\)表示以第\(i\)个节点结束的路径中含有\(c\)这个字母次数的最大值。则有\(dp[i][c]=\max_{j\in ind[i]}{dp[j][c]}+[a[i]==c]\), \(a[i]\)为第\(i\)个点的字母。
然后就可以得到答案了。时间复杂度\(O(mS)\), S为字符集大小26.
代码如下:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;const int N = 3e5;
const int S = 26;
struct Edge
{int v,nxt; bool used;
} e[N+3];
int fe[N+2];
char s[N+2];
int a[N+2];
int dfn[N+2],low[N+2];
int sta[N+2];
bool ins[N+2],vis[N+2];
int dp[N+2][S+2];
int ind[N+2];
int que[N+2];
int n,m,tp,mx,head,tail,tot;void addedge(int u,int v)
{e[++m].v = v; e[m].nxt = fe[u]; fe[u] = m;
}void Tarjan(int u)
{dfn[u] = low[u] = ++tp; sta[tp] = u; ins[u] = true;for(int i=fe[u]; i; i=e[i].nxt){int v = e[i].v;if(!dfn[v]) {Tarjan(v); low[u] = min(low[v],low[u]);}else if(ins[v]) low[u] = min(low[u],dfn[v]);}if(dfn[u]==low[u]){int tmp = 1;while(sta[tp]!=u && tp>0){int v = sta[tp];ins[v] = false;tp--; tmp++;}ins[u] = false; tp--;if(tmp>mx) mx = tmp;}
}int main()
{int m0; m = 0;scanf("%d%d",&n,&m0);scanf("%s",s+1); for(int i=1; i<=n; i++) a[i] = (int)s[i]-'a'+1;for(int i=1; i<=m0; i++) {int x,y; scanf("%d%d",&x,&y); addedge(x,y); if(x==y) {printf("-1\n"); return 0;}}for(int i=1; i<=n; i++) {if(!dfn[i]) Tarjan(i);}if(mx>1) {printf("-1\n"); return 0;}for(int i=1; i<=n; i++){for(int j=fe[i]; j; j=e[j].nxt) ind[e[j].v]++;}tot = 0;for(int i=1; i<=n; i++) dp[i][a[i]] = 1;while(tot<n){for(int j=1; j<=n; j++){if(ind[j]==0 && vis[j]==false){tail++;que[head] = j; vis[j] = true; tot++;while(head<=tail){int c = que[head++];for(int i=fe[c]; i; i=e[i].nxt){if(e[i].used) continue;e[i].used = true;ind[e[i].v]--;for(int k=1; k<=S; k++){if(a[e[i].v]==k) dp[e[i].v][k] = max(dp[e[i].v][k],dp[c][k]+1);else dp[e[i].v][k] = max(dp[e[i].v][k],dp[c][k]);}if(ind[e[i].v]==0 && vis[e[i].v]==false){vis[e[i].v] = true; tot++;que[++tail] = e[i].v;}}}}}}int ans = 0;for(int i=1; i<=n; i++){for(int j=1; j<=S; j++) ans = max(ans,dp[i][j]);}printf("%d\n",ans);return 0;
}

发表于 2019-01-22 19:36 suncongbo 阅读(...) 评论(...) 编辑 收藏

刷新评论刷新页面返回顶部

Codeforces 919D Substring (拓扑图DP)相关推荐

  1. Codeforces 919D - Substring

    919D - Substring 思路: 拓扑排序判环+DAG上dp+记忆化搜索 状态:dp[i][j]表示以i为起点的路径中j的最大出现次数 初始状态:dp[i][j]=1(i have no so ...

  2. [CodeForces 332B]Maximum Absurdity[DP]

    题目链接: [CodeForces 332B]Maximum Absurdity[DP] 题意分析: 寻找两个不重叠的长度为k的子串,使得它们之和最大. 解题思路: 第一想法是,处理出从这个点开始,长 ...

  3. 微软2016校园招聘在线笔试 B Professor Q's Software [ 拓扑图dp ]

    传送门 题目2 : Professor Q's Software 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Professor Q develops a new s ...

  4. 【CodeForces 1042B --- Vitamins】DP+位运算

    [CodeForces 1042B --- Vitamins]DP+位运算 题目来源:点击进入[CodeForces 1042B - Vitamins] Description Berland sho ...

  5. [CodeForces 300D Painting Square]DP

    http://codeforces.com/problemset/problem/300/D 题意:每一次操作可以选一个正方形,令边长为n,如果n为奇数那么可以从中间画一个十字,分成4个大小相等的边长 ...

  6. Codeforces 1322D Reality Show (DP)

    题目链接 https://codeforces.com/contest/1322/problem/D 题面写得非常模糊,很容易读错题,建议参考翻译:https://www.luogu.com.cn/p ...

  7. CodeForces - 1579G Minimal Coverage(dp)

    题目链接:点击查看 题目大意:给出 nnn 个长度不同的木棍.设第 i−1i-1i−1 次放置木棍后的终点为 xxx,那么第 iii 个木棍有且仅有两种放置方法: 放到 [x+1,x+a[i]][x+ ...

  8. CodeForces - 1562E Rescue Niwen!(dp)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的字符串 sss,将其子串按顺序展开成序列,即 {s1,s1s2,⋯,s1s2-sn,s2,s2s3,s2s3-sn,s3,s3s4,⋯,sn−1 ...

  9. CodeForces - 1551E Fixed Points(dp)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的序列,需要求出删掉最少的数字,使得剩下的数字至少有 kkk 个位置满足 a[i]=ia[i]=ia[i]=i 成立 题目分析:看完数据范围不难想 ...

最新文章

  1. MSF渗透测试-CVE-2017-11882(MSOffice漏洞)
  2. hdu4993(水题)
  3. iOS App 上架(Analysis 工具使用)
  4. ML之xgboostGBM:基于xgboostGBM算法对HiggsBoson数据集(Kaggle竞赛)训练(两模型性能PK)实现二分类预测
  5. go java jsonrpc_使用golang 实现JSON-RPC2.0
  6. Job 存储和持久化 (第一部分)
  7. Geek必备神器 - Google眼镜(Google glass)的十大特色
  8. windows如何安装MySql(包含一些安装时问题的解决)
  9. Win10 触摸屏 快捷键操作
  10. n2n内网穿透神器--可以用于设置rac搭建时的网卡(在云平台上有用)
  11. Python Pillow(PIL)库的用法介绍
  12. php大型博客,PHP大型Web应用入门(二)
  13. Spring AOP 的术语
  14. 无需破解,官网安装Visual Studio 2013社区版
  15. python数据分析实战之用户分析及RFM模型分析
  16. 阿里云ECS_Linux服务器解决蠕虫病毒MinerGuard
  17. 用热传导方程来指导自监督学习
  18. 浙江理工大学电子计算机,2021浙江理工大学电子信息(计算机技术)085400考研调剂信息...
  19. 【往届期末试卷】毛概期末试卷
  20. eosio.cdt:EOS智能合约工具集

热门文章

  1. 云炬Android开发报错处理教程 完美解决Android Studio maven { url ‘https://jitpack.io‘ } 无法下载问题
  2. swift. 扩展类添加属性_Swift中用到extension的一些基本的扩展功能讲解
  3. python代码物理_利用python求解物理学中的双弹簧质能系统详解
  4. [scala-spark]6. 继承与特质trait
  5. 推荐系统-应用Pandas进行数据处理
  6. C#操作SQLite数据库时出现“Insufficient parameters supplied to the command”的错误
  7. net4.0 兼容2.0的方法
  8. delphi 垃圾回收框架
  9. 【CyberSecurityLearning 13】简单抓包及 IP包头分析与 路由原理(一)
  10. 如何在spring中读取properties配置文件里面的信息