Wannafly挑战赛22:B. 字符路径
题目描述
给一个含n个点m条边的有向无环图(允许重边,点用1到n的整数表示),每条边上有一个字符,问图上有几条路径满足路径上经过的边上的字符组成的的字符串去掉空格后以大写字母开头,句号 '.' 结尾,中间都是小写字母,小写字母可以为0个。
输入描述:
第一行两个整数n,m 接下来m行,每行两个整数a,b和一个字符c,表示一条起点为a,终点为b的边,边上的字符是c 1 ≤ n, m ≤ 50000 1 ≤ a < b ≤ n c可以是大小写字母、句号 '.' 或空格(方便起见用 '_' 表示空格)
输出描述:
输出一个整数,表示答案对232取模的结果
直接拓扑排序+DP嘛
dp[x][0]表示以x节点结尾,路径上只有空格的路径个数
dp[x][1]表示以x节点结尾,路径上去掉空格后,第一个字母是大写字母,大写字母后只有小写字母的路径个数
dp[x][2]表示以x节点结尾,满足题目条件的合法路径个数
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<ctype.h>
#include<string>
#include<math.h>
#include<queue>
#include<stack>
#include<iostream>
using namespace std;
#define uint unsigned int
#define mod 1000000007
typedef struct
{int v;char ch;
}Road;
Road now;
queue<int> q;
vector<Road> G[50005];
int in[50005];
uint dp[50005][3];
int main(void)
{char ch;uint ans;int n, m, i, x, y;scanf("%d%d", &n, &m);for(i=1;i<=m;i++){scanf("%d%d %c", &x, &now.v, &now.ch);G[x].push_back(now);in[now.v]++;}for(i=1;i<=n;i++){if(in[i]==0)q.push(i);}while(q.empty()==0){x = q.front();q.pop();for(i=0;i<G[x].size();i++){now = G[x][i];y = now.v, ch = now.ch;in[y]--;if(in[y]==0)q.push(y);if(ch=='_'){dp[y][0] += dp[x][0]+1;dp[y][1] += dp[x][1];dp[y][2] += dp[x][2];}else if(isupper(ch))dp[y][1] += dp[x][0]+1;else if(islower(ch))dp[y][1] += dp[x][1];elsedp[y][2] += dp[x][1];}}ans = 0;for(i=1;i<=n;i++)ans += dp[i][2];printf("%u\n", ans);return 0;
}
Wannafly挑战赛22:B. 字符路径相关推荐
- Wannafly挑战赛22 B 字符路径 ( 拓扑排序+dp )
链接:https://ac.nowcoder.com/acm/contest/160/B 来源:牛客网 题目描述 给一个含n个点m条边的有向无环图(允许重边,点用1到n的整数表示),每条边上有一个字符 ...
- Wannafly挑战赛22游记
Wannafly挑战赛22游记 幸运的人都是相似的,不幸的人各有各的不幸. --题记 A-计数器 题目大意: 有一个计数器,计数器的初始值为\(0\),每次操作你可以把计数器的值加上\(a_1,a_2 ...
- Wannafly挑战赛22
B. 字符路径 给一个含n个点m条边的有向无环图(允许重边,点用1到n的整数表示),每条边上有一个字符,问图上有几条路径满足路径上经过的边上的字符组成的的字符串去掉空格后以大写字母开头,句号 '.' ...
- Wannafly挑战赛22 C 多项式(大数,多项式极限)
链接:https://ac.nowcoder.com/acm/contest/160/C 来源:牛客网 多项式 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言 ...
- Wannafly挑战赛22 D 整数序列 (线段树维护三角函数值)
链接:https://ac.nowcoder.com/acm/contest/160/D 来源:牛客网 整数序列 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语 ...
- Wannafly挑战赛22: C. 多项式(大整数)
题目描述 求,其中f和g是关于x的多项式. 输入描述: 两行,第一行为f,第二行为g. f和g都用一个由小括号 '(' 和 ')' .加号 '+' .乘号 '*' . 'x' 组成的表达式表示,表达式 ...
- Wannafly挑战赛22 D-整数序列 (线段树)
https://www.nowcoder.com/acm/contest/160/D 做法:用线段树维护,对于树上的每个叶子结点,维护一个复数结构体 cos(a[i] + sin(a[i])*i ,每 ...
- [Wannafly挑战赛2D-Delete]最短路
[Wannafly挑战赛2D-Delete]最短路 题目描述 给定一张 n 个点,m 条边的带权有向无环图,同时给定起点 S 和终点 T ,一共有 q 个询问,每次询问删掉某个点和所有与它相连的边之后 ...
- Wannafly挑战赛19
Wannafly挑战赛19 A. 队列Q 需要支持把一个元素移到队首,把一个元素移到队尾,移到队首就直接放到队首前面那个位置,原位置标为0,队尾同理. #include <bits/stdc++ ...
最新文章
- 正则表达式的学习二:正则表达式的匹配规则总结
- Three.js学习笔记 – “我和小伙伴都惊呆了”的特效和Three.js初探
- Coding 初级教程(二)——上传已有项目
- MySQL 高可用:mysql+mycat实现数据库分片(分库分表)
- 通过Main的Checkpoint Restore加快Java启动速度
- 精益设计:“纸上谈兵”的说服力
- react leaflet_如何使用React Leaflet和Leaflet Gatsby Starter设置自定义Mapbox底图样式
- oracle DB_LINK
- 小区进入刷卡,快递不方便
- Screenpresso-截图工具绿色版
- 【zhasite】托业英语阅读技巧有哪些
- 抖音短视频教程VIP培训课程(2019实时更新中)
- 万字长文分析递归算法的时间和空间复杂度,从此对递归不再迷茫!
- oracle虚拟用户和密码,创建 Virtual Private Catalog(虚拟用户目录)(Oracle 11g)
- 基于埋点日志数据的网络流量统计(网站独立访客数(UV)的统计)
- pandas DataFrame 直接生成plot图片 pandas.DataFrame.plot()
- SSD或者机械硬盘的读取速度查询
- java动漫网站开题报告_动漫影响及其研究开题报告
- xml文件的注释展示
- 小清新个人简历PPT模板