POJ3630 Phone List

2014-11-24 11:34:45 · 作者: · 浏览: 0

思考:先对号码排序,然后一步步插入字典树。

#include 
  
   
#include 
   
     #include 
    
      #include 
     
       #include 
      
        #include 
       
         using namespace std; const int maxn = 100100; // maxn = 10010, Runtime error. //3630 Accepted 3076K 266MS C++ 1194B 2014-04-03 22:15:46 vector
        
          v; int sz; int ch[maxn+5][10]; int val[maxn+5]; bool mark; int idx(char x) { return x-'0'; } void init() { sz = 1; mark = true; memset(ch[0], 0, sizeof(ch[0])); memset(val, 0, sizeof(val)); } void Insert(char* str) { int len = strlen(str); int u = 0; for(int i = 0; i < len; i++) { int v = idx(str[i]); if(!ch[u][v]) { memset(ch[sz], 0, sizeof(ch[sz])); ch[u][v] = sz++; } u = ch[u][v]; if(val[u]) { mark = false; } } val[u] = 1; } int main() { int T, n; char str[12]; scanf("%d", &T); getchar(); while(T--) { v.clear(); scanf("%d", &n); getchar(); init(); while(n--) { gets(str); string tmp = str; v.push_back(tmp); } sort(v.begin(), v.end()); for(int i = 0; i < (int)v.size(); i++) { int len = v[i].length(); v[i].copy(str, len); str[len] = '\0'; // !!!. Insert(str); } if(mark) printf("YES\n"); else printf("NO\n"); } return 0; }