CF919D Substring (dag dp)
解题思路
感觉这种题都是套路,首先缩点判了环(没看见自环挂了一次。。),然后设\(f[x][i]\)表示到了\(x\),\(i\)这个字母走过的最长距离,然后拓扑排序更新即可。
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<queue>
using namespace std;
const int MAXN = 300005;
inline int rd(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)) {f=ch=='-'?0:1;ch=getchar();}
while(isdigit(ch)) {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return f?x:-x;
}
int n,m,head[MAXN],cnt,dfn[MAXN],low[MAXN],num,w[MAXN],ans;
int to[MAXN],nxt[MAXN],f[MAXN][30],stk[MAXN],top,deg[MAXN];
bool vis[MAXN],flag;
char s[MAXN];
queue<int> Q;
inline void add(int bg,int ed){
to[++cnt]=ed,nxt[cnt]=head[bg],head[bg]=cnt;
}
void tarjan(int x){
dfn[x]=low[x]=++num;stk[++top]=x;vis[x]=1;
for(register int i=head[x];i;i=nxt[i]){
int u=to[i];
if(!dfn[u]) {tarjan(u);low[x]=min(low[x],low[u]);}
else if(vis[u]) low[x]=min(low[x],dfn[u]);
}
if(low[x]==dfn[x]) {
if(stk[top]!=x) {flag=1;return;}
top--;vis[x]=0;
}
}
int main(){
n=rd(),m=rd();int x,y;
scanf("%s",s+1);
for(int i=1;i<=n;i++) w[i]=s[i]-'a'+1;
for(int i=1;i<=m;i++){
x=rd(),y=rd();deg[y]++;
if(x==y) flag=1;
add(x,y);
}
for(int i=1;i<=n;i++) if(!dfn[i]) tarjan(i);
if(flag) {puts("-1");return 0;}
else{
for(int i=1;i<=n;i++) if(!deg[i]) Q.push(i),f[i][w[i]]=1;
while(Q.size()){
int x=Q.front();Q.pop();
for(register int i=head[x];i;i=nxt[i]){
int u=to[i];
f[u][w[u]]=max(f[u][w[u]],f[x][w[u]]+1);
for(int k=1;k<=26;k++) if(w[u]!=k) f[u][k]=max(f[u][k],f[x][k]);
deg[u]--;if(!deg[u]) Q.push(u);
}
if(!head[x]) for(int i=1;i<=26;i++) ans=max(ans,f[x][i]);
}
}
printf("%d\n",ans);
return 0;
}
CF919D Substring (dag dp)的更多相关文章
- Codeforces Round #460 (Div. 2): D. Substring(DAG+DP+判环)
D. Substring time limit per test 3 seconds memory limit per test 256 megabytes input standard input ...
- 5.Longest Palindromic Substring (String; DP, KMP)
Given a string S, find the longest palindromic substring in S. You may assume that the maximum lengt ...
- [SDOI2010] 所驼门王的宝藏 [建图+tarjan缩点+DAG dp]
题面传送门: 传送门 思路: 看完题建模,容易得出是求单向图最长路径的问题 那么把这张图缩强联通分量,再在DAG上面DP即可 然而 这道题的建图实际上才是真正的考点 如果对于每一个点都直接连边到它所有 ...
- CF459E Pashmak and Graph (Dag dp)
传送门 解题思路 \(dag\)上\(dp\),首先要按照边权排序,然后图都不用建直接\(dp\)就行了.注意边权相等的要一起处理,具体来讲就是要开一个辅助数组\(g[i]\),来避免同层转移. 代码 ...
- D. Mysterious Present DAG dp
https://codeforces.com/problemset/problem/4/D 这个题目比较简单,就是一个DAG模型,这个可以看看紫书学习一下, 我这次是用dp来写的,用记忆化搜索也许更好 ...
- 5. Longest Palindromic Substring (DP)
Given a string S, find the longest palindromic substring in S. You may assume that the maximum lengt ...
- CF919D Substring
思路: 拓扑排序过程中dp.若图有环,返回-1. 实现: #include <bits/stdc++.h> using namespace std; ; vector<int> ...
- Codeforces 919D Substring (拓扑图DP)
手动博客搬家: 本文发表于20180716 10:53:12, 原地址https://blog.csdn.net/suncongbo/article/details/81061500 给定一个\(n\ ...
- poj3249 Test for job 【图的DAG dp】
#include <cstdio> #include <cstdlib> #include <iostream> #include <algorithm> ...
随机推荐
- w - 显示已经登录的用户以及他们在做什么
总览 (SYNOPSIS) w - [husfV] [user] 描述 (DESCRIPTION) w 显示 系统中 当前用户 的 信息, 以及 他们 的 进程. 第一行 中 依次 显示 当前时间, ...
- MySQL 开始
安装,配置环境变量啥的,网上一抓一大堆,不说了.就说我再实际操作中遇到的问题. 1 添加自增列 点击apply,直接提示一个错误....百思不得其解..上图... 添加不了自增列....好恐怖.. ...
- vue 监听的使用
watch:{ 监听的属性:function(旧值,新值) { } } 代码: <!DOCTYPE html> <html lang="en" ...
- shell脚本中:单引号和双引号的区别
单引号和双引号的区别 前面我们还留下一个疑问,定义变量时,变量的值可以由单引号' '包围,也可以由双引号" "包围,它们到底有什么区别呢?不妨以下面的代码为例来说明: #!/bin ...
- php注册和登陆与数据库的链接
注册和登陆其实是从一个表中进行提取和写入数据 1.(1)先建立一个注册页面 1 2 3 4 5 6 7 8 9 <body> <h1>注册页面</h1&g ...
- PyQt5显示日期选择框,获取日期保存文件
一.UI显示选择日期,保存到文件 import sys,os from PyQt5 import QtCore from PyQt5.QtGui import * from PyQt5.QtWidge ...
- NX二次开发-C++time函数计时
NX11+VS2013 #include <uf.h> #include <uf_modl.h> #include <uf_ui.h> #include <t ...
- IOS自动化打包介绍
IOS自动化打包介绍 标签: app打包 , Ios打包 , iphone打包 , iphone自动化打渠道包 分类:无线客户端技术, 贴吧技术 摘要 随着苹果手持设备用户的不断增加,ios应 ...
- JavaScript笔记 – 程序语法设计
一.基础语法设计 JavaScript是可以与HTML标记语言混合.用于网页交互式的解释型脚本语言.由国际标准ECMAScript提供核心语言功能.文档对象模型(DOM)提供访问和操作网页内容的方法和 ...
- 全面解读PHP面试
php面试考察点 1.PHP基础知识 引用变量 常量及数据类型 运算符及流程控制 自定义函数及内部函数 正则表达式 文件及目录处理 会话控制 面向对象 网络协议 开发环境相关考点 2.JavaS ...