程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> poj - 3630 - Phone List

poj - 3630 - Phone List

編輯:C++入門知識

題意:給出n個電話號碼(僅由數字0-9組成),問是否存在一個號碼是另一個號碼的前綴(1 ≤ 測試組數t ≤ 40,1 ≤ n ≤ 10000)。   題目鏈接:http://poj.org/problem?id=3630   ——>>做這題太無語啦。。。明明就只是一棵Trip,可直到比賽結束都是TLE,究其原因,太什麼啦。。。指針寫Trip。。。   此題應用靜態數組寫Trip。。。  

#include <cstdio>  
#include <cstring>  
#include <queue>  
  
using namespace std;  
  
const int maxw = 10 + 5;  
const int maxc = 100000 + 10;  
char p[maxw];  
bool ok, isp[maxc];  
int ch[maxc][10];  
  
struct Trip{  
    int sz;  
  
    Trip(){  
        sz = 1;  
        memset(isp, 0, sizeof(isp));  
        memset(ch, 0, sizeof(ch));  
    }  
  
    int idx(char c){  
        return c - '0';  
    }  
  
    void insert(char *s){  
        int len = strlen(s), i;  
        int u = 0;  
        for(i = 0; i < len; i++){  
            int c = idx(s[i]);  
            if(!ch[u][c]) ch[u][c] = sz++;  
            else{  
                if(i == len-1){  
                    ok = 0;      //目前電話是另外電話的前綴  
                    break;  
                }  
                if(isp[ch[u][c]]){  
                    ok = 0;     //另外電話是目前電話的前綴  
                    break;  
                }  
            }  
            u = ch[u][c];  
        }  
        isp[u] = 1;  
    }  
  
    void solve(){  
        if(ok) puts("YES");  
        else puts("NO");  
    }  
};  
  
int main()  
{  
    int t, n;  
    scanf("%d", &t);  
    while(t--){  
        ok = 1;  
        scanf("%d", &n);  
        Trip trip;  
        for(int i = 0; i < n; i++){  
            scanf("%s", p);  
            if(ok) trip.insert(p);  
        }  
        trip.solve();  
    }  
    return 0;  
}  

 


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved