1. 程式人生 > >山東省第一屆ACM大學生程式設計競賽 Phone Number 字典樹

山東省第一屆ACM大學生程式設計競賽 Phone Number 字典樹

Phone Number

Time Limit: 1000ms   Memory limit: 65536K  有疑問?點這裡^_^

題目描述

We know that if a phone number A is another phone number B’s prefix, B is not able to be called. For an example, A is 123 while B is 12345, after pressing 123, we call A, and not able to call B.
Given N phone numbers, your task is to find whether there exits two numbers A and B that A is B’s prefix.

輸入

 The input consists of several test cases.
 The first line of input in each test case contains one integerN (0<N<1001), represent the number of phone numbers.
 The next line containsN integers, describing the phone numbers.
 The last case is followed by a line containing one zero.

輸出

 For each test case, if there exits a phone number that cannot be called, print “NO”, otherwise print “YES” instead.

示例輸入

2
012
012345
2
12
012345
0

示例輸出

NO
YES

提示

來源

 2010年山東省第一屆ACM大學生程式設計競賽

水題字典樹,判斷是否有字首號碼出現

ACcode:

#include <map>
#include <queue>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
#define MAX 10
#define maxn 1005
using namespace std;
struct Trie{
    Trie* next[MAX];
    int v;
};
struct STR{
    char str[maxn];
    int len;
    bool operator<(const STR &a)const{
        return (this->len<a.len);
    }
}my[maxn];
Trie *root;
int n,ans,num;
void createTire(char *str){
    int len=strlen(str);
    Trie *p=root,*q;
    for(int i=0;i<len;++i){
        int id=str[i]-'0';
        if(p->next[id]==NULL){
            q=(Trie *)malloc(sizeof(Trie));
            q->v=1;
            for(int j=0;j<MAX;++j)
                q->next[j]=NULL;
            p->next[id]=q;
            p=p->next[id];
        }
        else{
            p->next[id]->v++;
            p=p->next[id];
        }
    }
    p->v=-1;
}
int findTrie(char *str){
    int len=strlen(str);
    Trie *p=root;
    for(int i=0;i<len;++i){
        int id=str[i]-'0';
        p=p->next[id];
        if(p==NULL)
            return 0;
        if(p->v==-1)
            return 0;
    }
    return 2;
}
void init(){
    root=(Trie *)malloc(sizeof(Trie));
    for(int i=0;i<MAX;++i)
        root->next[i]=NULL;
    ans=num=0;
    memset(my,0,sizeof(my));
}
int main(){
    while(~scanf("%d",&n)&&n){
        init();
        for(int i=0;i<n;++i){
            scanf("%s",my[i].str);
            my[i].len=strlen(my[i].str);
        }
        sort(my,my+n);
        for(int i=0;i<n;++i)createTire(my[i].str);
     //   for(int i=0;i<n;i++)cout<<my[i].str<<'\12';
        for(int i=0;i<n;++i)
            ans+=findTrie(my[i].str);
            //cout<<"ans: "<<ans<<'\12';
        for(int i=0;i<n&&!ans;++i)
            for(int j=i+1;j<n;++j)
                if(!strcmp(my[i].str,my[j].str))
                    ans++;
        printf(ans>0?"NO\n":"YES\n");
    }
    return 0;
}
/*
2
012
012345
2
12
012345
0
*/

暴力做法

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <vector>
#define maxn 1005
#define inf 0x7fffffffff
#define ll long long
using namespace std;
int n,m,loop;
struct N {
    char s[maxn];
    int len;
}my[maxn];
bool cmp(N a,N b){return a.len<b.len;}
int len[maxn];
int main(){
    while(scanf("%d",&n)&&n){
        for(int i=1;i<=n;++i){
            scanf("%s",my[i].s);
            my[i].len=strlen(my[i].s);
        }
        sort(my+1,my+1+n,cmp);
        bool flag=true;
        for(int i=1;flag&&i<=n;++i)
            for(int j=i+1;flag&&j<=n;++j){
                int ok=0;
                for(int z=0;z<my[i].len;++z)
                        if(my[i].s[z]==my[j].s[z])ok++;
                if(ok==my[i].len)flag=false;
            }
        if(flag)puts("YES");
        else puts("NO");
    }
    return 0;
}


相關推薦

山東省第一ACM大學生程式設計競賽 Phone Number 字典

Phone Number Time Limit: 1000ms   Memory limit: 65536K  有疑問?點這裡^_^ 題目描述 We know that if a phone number A is another phone number B’s

2010年山東省第一ACM大學生程式設計競賽——Greatest Number

Greatest Number 題目意思:給你一串數,任取四個,可以重複,求最大值,但不能超過m。 可以先將任意兩個數相加,然後再二分查詢求出符合題意的最大值即可。 #include<i

[2010山東省第一ACM大學生程式設計競賽]——Hello World!

Hello World!題目描述 We know that Ivan gives Saya three problems to solve (Problem F), and this is the first problem. “We need a programmer t

“浪潮杯”山東省第八ACM大學生程式設計競賽I

Fascinated with the computer games, Gabriel even forgets to study. Now she needs to finish her homework, and there is an easy problem: f(n)= She is requir

2015年山東省第六ACM大學生程式設計競賽-B-Lowest Unique Price

Link: http://www.sdutacm.org/sdutoj/problem.php?action=showproblem&problemid=3252 Lowest Unique Price Time Limit: 1000ms

SDUT 3258 Square Number(2015年山東省第六ACM大學生程式設計競賽)

Square Number Time Limit: 1000ms   Memory limit: 65536K  有疑問?點這裡^_^ 題目描述 In mathematics,

“浪潮杯”山東省第八ACM大學生程式設計競賽 J

sell goods whose price with order as -1, 5, 6, 6, the total benefit would be -1*1 + 5*2 + 6*3 + 6*4 = 51. 01 #include <iostream>

山東省第七ACM大學生程式設計競賽 總結

很惋惜的一場比賽,比賽前我想了很多個結局,可能是銀牌中等,銀牌末尾,要是運氣好的可能能混一個金牌回來。。但是銀首這個真的是超乎我意料之外。。。 開始比賽的不久我就看到了K題,一個作為簽到題的存在,開始習慣性的先敲輸入輸出。寫完輸入輸出之後感覺沒有比較好寫的思路

Fruit Ninja II(山東省第三ACM大學生程式設計競賽

Have you ever played a popular game named "Fruit Ninja"? Fruit Ninja (known as Fruit Ninja HD on the iPad and Fruit Ninja THD for Nvidia Tegra 2 based A

山東省第三ACM大學生程式設計競賽 Fruit Ninja I(01揹包)

01揹包 加上vector的運用,貪心sort排序 #include <stdio.h> #include <vector> #include <string.h>

“浪潮杯”山東省第九屆ACM大學生程式設計競賽

目錄 題目描述 輸入描述: 輸出描述: 輸入 輸出 解析: 程式碼: 題目描述 輸入描述: 輸出描述: 輸入 輸出 題目描述 輸入描述: 輸出描述: 輸入 輸出 題目描述 輸入描述: 輸出描述: 輸入 輸出 題

“浪潮杯”山東省第九屆ACM大學生程式設計競賽 F Four-tuples (容斥原理)

題目連結 比賽時推了好久的容斥,結果推錯了,過了樣例就交了,然後A了。後來才知道這題有bug。菜啊。 題意:給定四個區間(li,ri)(li,ri)(閉區間),求一個四元組(x1,x2,x3,x4)(x1,x2,x3,x4),滿足xixi在區間(li,ri)

2017河南省第十ACM大學生程式設計競賽總結

河南第十屆大學生程式設計競賽總結             比賽過程隊友部落格有記錄:http://blog.csdn.net/dreamNYC/article/details/71417450             主要就總結下這次比賽的感受:                     我們隊雖然和

“浪潮杯”第九屆山東省ACM大學生程式設計競賽重現賽 題解

點選轉到(牛客網) 1.思路:       給定兩個字串,假設是ELLY與KRIS,E到K是6,L到R是6,當第二個L到I時,L是比I大的,此時L就要繞到Z,從Z到A,再從A開始到I,這樣長度就是23,Y到S同理,長度是20;這樣找完之後序列長度之和就是6 +6+23

2018山東省ACM大學生程式設計競賽B.Bullet

In GGO, a world dominated by gun and steel, players are fighting for the honor of being the strongest gunmen. Player Shino is a sniper, and her aimed shot

“浪潮杯”第九屆山東省ACM大學生程式設計競賽 D-Dance

來源:牛客網題意:在根節點為0的樹上(編號:0,1,2...n)。一條邊上有兩個值 poweri ,numi,相當於網路流:poweri相當於路上的cost,numi相當於容量,相當於匯點為0,源點為所有葉子節點,求最大費用。樣例:70 100 01 2 32 2 51 5

“浪潮杯”第九屆山東省ACM大學生程式設計競賽重現賽 G game (尼姆博弈)

題目描述 Alice and Bob are playing a stone game. There are n piles of stones. In each turn, a player can remove some stones from a pile (th

Emergency(山東省第一ACM程序設計真題+Floyd算法變型)

prev eno lead 解題思路 ats next gen book lin 題目描述 Kudo’s real name is not Kudo. Her name is Kudryavka Anatolyevna Strugatskia, and Kudo is o

第八福建省大學生程式設計競賽-FZU 2280 HASH處理+暴力搜尋

題目:Problem 2280 Magic  Problem Description Kim is a magician, he can use n kinds of magic, number from 1 to n. We use string Si to describe m

第八福建省大學生程式設計競賽-FZU 2277 DFS +線段+讀入掛

FZU 2277  Problem 2277 Change Accept: 245    Submit: 1186 Time Limit: 2000 mSec    Memory Limit : 262