字典树攻关代码

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e3;
struct node {
    int v;
    char c;
};
vector<node> g[maxn];
int dfn[maxn];
int dfo[maxn];
int N;
int cnt;
int l1[maxn];
int r1[maxn];
int l2[maxn];
int r2[maxn];
int xz[maxn];
int visit[maxn];
int vc[maxn][256][2];
int ck[maxn][256]={0};
void dfs (int u) {
    visit[u]=1;
    dfn[u]=++cnt;
    for (int i=0;i<g[u].size();i++) 
        if (!visit[g[u][i].v]) dfs(g[u][i].v);
    dfo[u]=cnt;
}
int main () {
    int T;
    int u,v;
    char c;
    scanf("%d",&T);
    while (T--) {
        scanf("%d",&N);
        memset(l1,0,sizeof(l1));
        memset(xz,0,sizeof(xz));
        memset(visit,0,sizeof(visit));
        memset(ck,0,sizeof(ck));
        for (int i=1;i<=N;i++) g[i].clear();
        for (int i=1;i<=N-1;i++) {
            scanf("%d %d %c",&u,&v,&c);
            g[u].push_back({v,c});
            g[v].push_back({u,c});
            
            vc[u][c][ck[u][c]++]=v;
            vc[v][c][ck[v][c]++]=u;
        }
        cnt=0;
        dfs(1);
        int flag=0;
        for (int i=1;i<=N;i++) {
            int cnt[256]={0};
            for (int j=0;j<g[i].size();j++) 
                cnt[g[i][j].c]++;
            int f1=0;
            for (int j=0;j<256;j++) {
                if (cnt[j]==2) f1++;
                if (cnt[j]>2) {
                    flag=1;break;
                }
            }
            if (flag==1) break;
            if (f1>1) {
                flag==1;break;
            }
        }
        if (flag) {
            printf("0\n");continue;
        }
        for (int i=1;i<=N;i++) {
            //int vc[256][2];
            //int ck[256]={0};
            //for (int j=0;j<g[i].size();j++) 
                //vc[g[i][j].c][ck[g[i][j].c]++]=g[i][j].v;
            for (int j=0;j<256;j++) {
                if (ck[i][j]<2) continue;
                int t1=vc[i][j][0];
                int t2=vc[i][j][1];
                if (dfn[t1]>dfn[t2]) swap(t1,t2);
                if (dfn[i]>dfn[t1]) {
                    l1[i]=1;r1[i]=dfn[t1];
                    l2[i]=dfn[t2];r2[i]=dfo[t2];
                }
                else {
                    l1[i]=dfn[t1];
                    r1[i]=dfo[t1];
                    l2[i]=dfn[t2];
                    r2[i]=dfo[t2];
                }
                break;
            }
        }
        int ccc=0;
        for (int i=1;i<=N;i++) {
            if (!l1[i]) {
                ccc++;
                continue;
            }
            for (int j=l1[i];j<=r1[i];j++) xz[j]++;
            for (int j=l2[i];j<=r2[i];j++) xz[j]++;
        }
        int root=0;
        for (int i=1;i<=N;i++) 
            if (xz[i]==N-ccc) root++;
            
        printf("%d\n",root);
    }
} 

猜你喜欢

转载自www.cnblogs.com/zhanglichen/p/12435706.html