【链接】 我是链接,点我呀:)

【题意】

在这里输入题意

【题解】

如果有环
->直接输出-1
(拓扑排序如果存在某个点没有入过队列,说明有环->即入队的节点个数不等于n

否则。

说明可以做拓扑排序。

->是一个有向无环图。

那么定义f[x][y]

表示x节点前面的某条路径中,字母y出现的最多次数是多少次。

在拓扑排序的时候做DP就好。

(可以百度:有向无环图 DP 应该有挺多类似的题的

从入度为0的点开始进行DP。

然后遇到分叉的时候也没关系

取两条路中对应字母的较大值就好。

所以最后f[x][y]中不同字母的最大值可能就是不同的路径了。

(是哪一条不好说

然后显然你尽可能地多走一点路总是没错的。

(走过的点越多,字母出现的频率越高。

所以肯定是从一个端点到达另外一个端点。

(即从入度为0的端点开始走.

【代码】

#include <bits/stdc++.h>
using namespace std; const int N = 3e5; int n,m,k,flag[N+10],now,dp[N+10][30];
char s[N+10];
vector<int> g[N+10];
int ru[N+10],a[N+10];
queue<int> dl; int main(){
#ifdef LOCAL_DEFINE
freopen("rush_in.txt", "r", stdin);
#endif
ios::sync_with_stdio(0),cin.tie(0);
cin >> n >> m;
cin >>(s+1); for (int i = 1;i <= m;i++){
int x,y;
cin >> x >> y;
g[x].push_back(y);
ru[y]++;
} for (int i = 1;i <= n;i++){
a[i] = s[i]-'a'+1;
if (ru[i]==0){ dp[i][a[i]]++;
dp[i][0] = 1;
}
} int num = 0; for (int i = 1;i <= n;i++)
if (ru[i]==0){
num++;
dl.push(i);
ru[i] = -1;
} while (!dl.empty()){
int x = dl.front();
dl.pop();
for (int y:g[x]){
if (ru[y]<=0) continue;
if (dp[y][0]==0){
for (int i = 1;i <= 26;i++)
dp[y][i] = dp[x][i]+(a[y]==i);
}else{
for (int i = 1;i <=26;i++)
dp[y][i] = max(dp[y][i],dp[x][i]+(a[y]==i));
}
dp[y][0] = 1;
ru[y]--;
if (ru[y]==0){
num++;
dl.push(y);
}
}
}
if (num!=n){
cout<<-1<<endl;
return 0;
}
int ma = 0;
for (int i = 1;i <= n;i++)
if (dp[i][0]){
for (int j = 1;j <= 26;j++)
ma = max(ma,dp[i][j]);
}
cout<<ma<<endl;
return 0;
}

【Codeforces Round #460 (Div. 2) D】Substring的更多相关文章

  1. 【Codeforces Round #460 (Div. 2) C】 Seat Arrangements

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 用pre[i][j]表示第i行前j列的和. 然后枚举连续座位的最左上点. (有两种可能向右或向下k个. 则还需要处理出pre2[i] ...

  2. 【Codeforces Round #460 (Div. 2) B】 Perfect Number

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 直接暴力求出第k个perfect数字就好. 纯模拟. [代码] #include <bits/stdc++.h> #de ...

  3. 【Codeforces Round #460 (Div. 2) A】 Supermarket

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 就是让你求m*(ai/bb)的最小值 [代码] #include <bits/stdc++.h> #define dou ...

  4. 【Codeforces Round #432 (Div. 1) B】Arpa and a list of numbers

    [链接]h在这里写链接 [题意] 定义bad list是一个非空的.最大公约数为1的序列.给定一个序列,有两种操作:花费x将一个元素删除.花费y将一个元素加1,问你将这个序列变为good list所需 ...

  5. 【Codeforces Round #420 (Div. 2) C】Okabe and Boxes

    [题目链接]:http://codeforces.com/contest/821/problem/C [题意] 给你2*n个操作; 包括把1..n中的某一个数压入栈顶,以及把栈顶元素弹出; 保证压入和 ...

  6. 【Codeforces Round #420 (Div. 2) B】Okabe and Banana Trees

    [题目链接]:http://codeforces.com/contest/821/problem/B [题意] 当(x,y)这个坐标中,x和y都为整数的时候; 这个坐标上会有x+y根香蕉; 然后给你一 ...

  7. 【Codeforces Round #420 (Div. 2) A】Okabe and Future Gadget Laboratory

    [题目链接]:http://codeforces.com/contest/821/problem/A [题意] 给你一个n*n的数组; 然后问你,是不是每个位置(x,y); 都能找到一个同一行的元素q ...

  8. 【Codeforces Round #423 (Div. 2) C】String Reconstruction

    [Link]:http://codeforces.com/contest/828/problem/C [Description] 让你猜一个字符串原来是什么; 你知道这个字符串的n个子串; 且知道第i ...

  9. 【Codeforces Round #423 (Div. 2) B】Black Square

    [Link]:http://codeforces.com/contest/828/problem/B [Description] 给你一个n*m的格子; 里面包含B和W两种颜色的格子; 让你在这个格子 ...

随机推荐

  1. Asterisk[1]

    Asterisk[1]是一款GPLv2协议下的开源电话应用平台.简单来说,Asterisk是一个server应用.可以完毕发起电话呼叫.接受电话呼叫.对电话呼叫进行定制处理. 1.2.1 通道驱动 a ...

  2. Android 提示: The connection to adb is down, and a severe error has occured.

    今天早上打开Eclipse,一直提示 The connection to adb is down, and a severe error has occured,无法执行程序.重新启动Eclipse. ...

  3. [PHP]怎样在SAE的CodeIgniter项目中隐藏掉index.php

    第一步:改动项目根文件夹的config.yaml文件.加入例如以下内容: handle: - rewrite: if(!is_dir() && !is_file() && ...

  4. Android 经常使用工作命令mmm,mm,m,croot,cgrep,jgrep,resgrep,godir

    官方定义: Invoke ". build/envsetup.sh" from your shell to add the following functions to your ...

  5. [NOIP2015模拟10.27] 挑竹签 解题报告(拓扑排序)

    Description 挑竹签——小时候的游戏夏夜,早苗和诹访子在月光下玩起了挑竹签这一经典的游戏.挑竹签,就是在桌上摆上一把竹签,每次从最上层挑走一根竹签.如果动了其他的竹签,就要换对手来挑.在所有 ...

  6. iOS菜鸟成长笔记(3)——斯坦福公开课学习(1)

    一.iOS四层结构 1.Core OS 是用FreeBSD和Mach所改写的Darwin, 是开源.符合POSIX标准的一个Unix核心.这一层包含或者说是提供了整个iPhone OS的一些基础功能, ...

  7. 使用Visual Studio2012调试Redis源码

    Redis是一款C语言编写Key-Value存储系统,基于BSD协议开放源码,其源码托管在github上,大概有三万行. 源码地址:https://github.com/antirez/redis 源 ...

  8. 深入理解JavaScript定时机制

    容易欺骗别人感情的JavaScript定时器 JavaScript的setTimeout与setInterval是两个很容易欺骗别人感情的方法,因为我们开始常常以为调用了就会按既定的方式执行, 我想不 ...

  9. unbuntu禁用ipv6

    ubuntu禁用ipv6cat /proc/sys/net/ipv6/conf/all/disable_ipv6 显示0说明ipv6开启,1说明关闭 在 /etc/sysctl.conf 增加下面几行 ...

  10. php八大设计模式之策略模式

    策略模式提供一个虚拟的整体,根据不同的要求(参数)提供不同的"零件"(调用不同的"零件"实现不同的结果). <?php /** * 策略模式 * 跟工厂模 ...