牛课 字符路径 类似树形dp

传送门

#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;
}

猜你喜欢

转载自blog.csdn.net/du_lun/article/details/81808220
今日推荐