#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned int ui;
const ll INF=0x3f3f3f3f3f3f3f3f;
const int N=2e5+10;
int n, m;
struct node{
int v;
char ch;
};
vector<node> G[N];
ui dp[N][4];//0=空格联通的节点数,1='.',2='a'~'z', 3='A'~'Z';
ui ans;
bool vis[N];
void dfs(int u){
if(vis[u]) return;
dp[u][0]=1; vis[u]=1;
for(int i=0; i<G[u].size(); i++){
node it=G[u][i];
dfs(it.v);
if(it.ch=='_')
for(int j=0; j<4; j++) dp[u][j]+=dp[it.v][j];
else if(it.ch=='.')
dp[u][1]+=dp[it.v][0];
else if(islower(it.ch))
dp[u][2]+=(dp[it.v][2]+dp[it.v][1]);
else
dp[u][3]+=(dp[it.v][2]+dp[it.v][1]);
}
}
int main(){
scanf("%d%d", &n, &m);
int u, v; char ch;
for(int i=1; i<=m; i++){
scanf("%d%d %c", &u, &v, &ch);
G[u].push_back((node){v, ch});
}
for(int i=1; i<=n; i++)
dfs(i), ans+=dp[i][3];
printf("%u\n", ans);
return 0;
}
牛课 字符路径 类似树形dp
猜你喜欢
转载自blog.csdn.net/du_lun/article/details/81808220
今日推荐
周排行