POJ3283 Card Hands(字典樹)

題目大意:

給定n副牌計算一共有幾張牌出現,如果前綴或後綴相同則此前綴或此後綴上的牌只計算一次。

題目思路:本題要用到字典樹,並且將不同的牌用花色編號*13+牌號來記:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
int ans=0,p,n;
int a[100000][100];
char s[400000];
int q[300000],c[100000],w[100000],g[100000];
void lily(){//字典樹建樹
    int e=1;
    for(int i=0;i<n;i++){
        if(a[e][q[i]]==0)
            a[e][q[i]]=++p;
        e=a[e][q[i]];
    }
}
int main(void){
    int i,j,k,m,t;
    for(i=2;i<=9;i++)
        w[i+'0']=i-1;
    w['A']=0;w['J']=10;w['Q']=11;w['K']=12;
    g['c']=0;g['D']=13;g['H']=26;g['S']=39;
    while(scanf("%d",&t)==1&&t){
        memset(a,0,sizeof(a));//清空
        p=1;
        while(t--){
            scanf("%d",&n);
            for(i=0;i<n;i++){
                scanf("%s",s);
                if(s[0]=='1'&&s[1]=='0')//統計
                     q[n-i-1]=9+g[s[2]];
                else
                     q[n-i-1]=w[s[0]]+g[s[1]];
            }
            lily();
            for(i=0;i<n;i++)q[i]=0;//清空
        }
        printf("%d\n",p-1);//輸出
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章