设为首页 加入收藏

TOP

关于查询电话号码前缀实例
2013-09-26 19:53:03 来源: 作者: 【 】 浏览:79
Tags:关于 查询 电话号码 前缀 实例

  题意:给出n个电话号码(仅由数字0-9组成),问是否存在一个号码是另一个号码的前缀(1 ≤ 测试组数t ≤ 40,1 ≤ n ≤ 10000)。

  ――>>做这题太无语啦。。。明明就只是一棵Trip,可直到比赛结束都是TLE,究其原因,太什么啦。。。指针写Trip。。。

  此题应用静态数组写Trip。。。

  #include

  #include

  #include

  using namespace std;

  const int maxw = 10 + 5;

  const int maxc = 100000 + 10;

  char p[maxw];

  bool ok, isp[maxc];

  int ch[maxc] ;

  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;

  }

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇找出输出字符中最长回文串 下一篇求出最短路径实例分析

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: