Tire树裸题,一开始写动态的字典树,然后TLE,每次new一个新节点耗费时间较多。后来改成数组模拟的。

//#include <bits/stdc++.h>
#include <cstdio>
#include <cstring>
#include <algorithm> using namespace std ;
const int maxN = ; struct stringStruct {
char str[ ] ;
int len ;
}ss[ maxN ] ; struct tireNode {
int cnt ;
bool last ;
struct tireNode *next[ ] ;
tireNode ( ) {
cnt = ;
last = false;
memset ( next , , sizeof ( next ) ) ;
}
}; bool cmp ( stringStruct a , stringStruct b ) {
return a.len < b.len ;
} bool insert ( tireNode *root , char str[ ] ) {
int len = strlen ( str ) ;
tireNode *cur = root ; for ( int i= ; i<len ; ++i ) {
char ch = str[ i ] - '' ;
if ( cur -> next[ ch ] == NULL ) {
tireNode* newNode = new tireNode ;
cur -> next[ ch ] = newNode ;
}
if ( cur -> last ) return true ;
cur = cur -> next[ ch ] ;
cur->cnt++ ;
}
cur -> last = true ;
return false ;
} int main ( ) {
int T ;
for ( scanf( "%d" , &T ) ; T ; --T ) {
tireNode* root = new tireNode ;
int N ;
scanf ( "%d\n" , &N ) ;
for ( int i= ; i<=N ; ++i ) {
char ch = getchar ( ) ;
int lenn = ;
while ( ch != '\n' ) {
ss[ i ].str[ lenn++ ] = ch ;
ch = getchar ( ) ;
}
ss[ i ].len = lenn ;
}
sort ( ss + , ss + N + , cmp ) ;
bool flag = true ;
for ( int i= ; i<=N ; ++i ) {
if ( insert ( root , ss[ i ].str ) ) {
flag = false ;
break ;
}
}
if ( flag ) printf ( "YES\n" ) ;
else printf ( "NO\n" ) ;
}
return ;
}

TLE动态字典树

#include <cstdio>
#include <algorithm>
#include <cstring> using namespace std ;
const int maxN = ;
typedef long long LL ; struct stringStruct {
char str[ ] ;
int len ;
}ss[ maxN ] ; int trie[ maxN ][ ] ;
bool end[ maxN ] ;
bool cmp ( stringStruct a , stringStruct b ) {
return a.len < b.len ;
} int _cnt ; bool insert ( char str[ ] ) {
int cur = , len = strlen ( str + ) ;
for ( int i= ; i<=len ; ++i ) {
int ch = str[ i ] - '' ;
if ( !trie[ cur ][ ch ] )
trie[ cur ][ ch ] = ++_cnt ;
if ( end[ cur ] ) return true ;
cur = trie[ cur ][ ch ] ;
}
end[ cur ] = true ;
return false ;
} int main ( ) {
int T , N ;
for ( scanf ( "%d" , &T ) ; T ; --T ) {
memset ( trie , , sizeof ( trie ) ) ;
memset ( end , false , sizeof ( end ) ) ;
_cnt = ;
scanf ( "%d" , &N ) ;
for ( int i= ; i<=N ; ++i ) {
scanf ( "%s" , ss[ i ].str + ) ;
ss[ i ].len = strlen ( ss[ i ].str + ) ;
}
sort ( ss + , ss + N + , cmp ) ;
bool flag = true ;
for ( int i= ; i<=N ; ++i ) {
if ( insert ( ss[ i ].str ) ) {
flag = false ;
break ;
}
}
if ( flag )printf ( "YES\n" ) ;
else printf ( "NO\n" ) ;
}
return ;
}

AC数组模拟

POJ3630的更多相关文章

  1. POJ--1056 IMMEDIATE DECODABILITY && POJ--3630 Phone List(字典树)

    题目链接 题目大意 看输入的每个字符串中是否有一个字符串是另一个字符串的前缀 #include<iostream> #include<cstring> #include< ...

  2. POJ1056 IMMEDIATE DECODABILITY & POJ3630 Phone List

    题目来源:http://poj.org/problem?id=1056   http://poj.org/problem?id=3630 两题非常类似,所以在这里一并做了. 1056题目大意: 如果一 ...

  3. POJ3630/HDU-1671 Phone List,字典树静态建树!

    Phone List POJ动态建树TLE了~~~ 题意:拨打某个电话时可能会因为和其他电话号码的前几位重复而导致错误,现在给出一张电话单,求是否有某个电话是其他电话的前缀.是则输出NO,否则输出YE ...

  4. Phone List POJ-3630 字典树 or 暴力

    Phone List POJ-3630 字典树 or 暴力 题意 目前有 t 组数据, n 个电话号码,如果拨打号码的时候 先拨通了某个号码,那么这一串号码就无法全部拨通. 举个例子 911 和 91 ...

  5. HihoCoder第二周与POJ3630:Trie树的建立

    这又是两道一样的题,都是建立trie树的过程. HihoCoder第二周: 这里其实逻辑都很简单,主要在于数据结构struct的使用. #include <iostream> #inclu ...

  6. hdu杭电1671 / poj3630 字典树

    传送门 题意:输入n串数字 找出是否有存在串的前缀与另一个串相同 如果存在 输出NO否则输出YES 思路:用字典树解决 标记字典树总串的结尾 查找出一个串内部是否有被标记的节点 如果有那么说明存在前缀 ...

  7. POJ3630——简单Trie树

    这个题的意思是说,给出一些字符串,判断是否有字符串是另一个字符串的前缀,当然可以用排序水过,不过这个题拿来练习一下Trie树不错. 这个题在poj的discuss上好多人说必须要静态建树,估计都是用了 ...

  8. [POJ3630]Phone List (Tire)

    题意 trie字典树模板 LOJ有中文翻译https://loj.ac/problem/10049 思路 TIRE 代码 之前在LOJ上做过 直接交了 #include<cstdio> # ...

  9. poj3630 Phone List

    spy on一下,发现是trie裸题,结果一交就T... 然后把cin改成scanf就A了... trie的空间一定要开足,要不然RE #include <cstdio> #include ...

随机推荐

  1. combine_lat_dirs.sh

    #!/bin/bash # Copyright 2018 Jarvan Wang Apache 2.0. # Copyright 2016 Xiaohui Zhang Apache 2.0.     ...

  2. springboot格式化时间

    使用@RestController注解,返回的java对象中若含有date类型的属性,则默认输出为TIMESTAMP时间戳格式,可以在配置文件加入下面配置 spring.jackson.date-fo ...

  3. android 给view添加阴影

    1.方法一: 使用 CardView 布局 <android.support.v7.widget.CardView xmlns:android="http://schemas.andr ...

  4. emos邮件系统的web密码修改方法

     作者:邓聪聪 1.修改web管理界面的登陆密码,数据库修改管理员密码,有root用root,没root用系统用户.查看方法 进入数据库查看到管理表项中的root管理账户信息, mysql> u ...

  5. Day 18: 记filebeat内存泄漏问题分析及调优

    ELK 从发布5.0之后加入了beats套件之后,就改名叫做elastic stack了.beats是一组轻量级的软件,给我们提供了简便,快捷的方式来实时收集.丰富更多的数据用以支撑我们的分析.但由于 ...

  6. java学习笔记--从c/c++到java转变

    final修饰符1)final变量final表示“最后的,最终的”含义,变量一旦赋值后,不能被重新赋值.被final修饰的实例变量必须显示指定初始值.final修饰符通常和static修饰符一起来创建 ...

  7. mybatis:SQL拦截器

    打印执行的SQL语句 import java.sql.Connection; import java.text.DateFormat; import java.util.Date; import ja ...

  8. 基于spark-streaming实时推荐系统

    基于spark-streaming实时推荐系统(一) 基于spark-streaming实时推荐系统( 二) 基于spark-streaming实时推荐系统(三)

  9. SpringMVC 手动控制事务提交 【转】

    1.配置文件 applicationContext.xml: <bean id="txManager" class="org.springframework.jdb ...

  10. 非root用户加入docker用户组省去sudo

    服务器环境:centos7.6.1810,Docker version 18.09.3 1.使用有sudo权限的帐号登录到服务器系统,如:test用户 2.新建用户组docker之前,查看用户组中有没 ...