POJ3630

news/2024/12/29 12:22:41/

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

//#include <bits/stdc++.h>
#include <cstdio>
#include <cstring>
#include <algorithm>using namespace std ; 
const int maxN = 10010 ; struct stringStruct {char str[ 20 ] ; int len ; 
}ss[ maxN ] ; struct tireNode {int cnt ; bool last ; struct tireNode *next[ 10 ] ; tireNode ( ) {cnt = 0 ; last = false; memset ( next , 0 , 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=0 ; i<len ; ++i ) {char ch = str[ i ] - '0' ; 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=1 ; i<=N ; ++i ) {char ch = getchar ( ) ;int lenn = 0 ; while ( ch != '\n' ) {ss[ i ].str[ lenn++ ] = ch ; ch = getchar ( ) ;}ss[ i ].len = lenn ; } sort ( ss + 1 , ss + N + 1 , cmp ) ; bool flag = true ; for ( int i=1 ; i<=N ; ++i ) {if ( insert ( root , ss[ i ].str ) ) {flag = false ; break ; }}if ( flag ) printf ( "YES\n" ) ;else printf ( "NO\n" ) ;}return 0 ; 
}
TLE动态字典树
#include <cstdio>
#include <algorithm>
#include <cstring>using namespace std ; 
const int maxN = 100100 ;
typedef long long LL ; struct stringStruct {char str[ 20 ] ; int len ; 
}ss[ maxN ] ; int trie[ maxN ][ 10 ] ; 
bool end[ maxN ] ; 
bool cmp ( stringStruct a , stringStruct b ) {return a.len < b.len ; 
}int _cnt ;bool insert ( char str[ ] ) {int cur = 1 , len = strlen ( str + 1 ) ;  for ( int i=1 ; i<=len ; ++i ) {int ch = str[ i ] - '0' ; 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 , 0 , sizeof ( trie ) ) ;memset ( end , false , sizeof ( end ) ) ;_cnt = 1 ; scanf ( "%d" , &N ) ; for ( int i=1 ; i<=N ; ++i ) {scanf ( "%s" , ss[ i ].str + 1 ) ; ss[ i ].len = strlen ( ss[ i ].str + 1 ) ;}sort ( ss + 1 , ss + N + 1 , cmp ) ; bool flag = true ; for ( int i=1 ; i<=N ; ++i ) {if ( insert ( ss[ i ].str ) ) {flag = false ; break ; } }if ( flag )printf ( "YES\n" ) ; else printf ( "NO\n" ) ; }    return 0 ; 
}
AC数组模拟

 

转载于:https://www.cnblogs.com/shadowland/p/9934726.html


http://www.ppmy.cn/news/190291.html

相关文章

ibm3630m4服务器装系统,ibm x3630m4安装Windows2008R2系统

服务器型号&#xff1a;IBM X3630 M4 系统&#xff1a;Windowsserver2008R2 需求&#xff1a; 远程指导客户在IBM system x3630 M4服务器上安装windowsserver2008R2系统&#xff0c;用时1个多小时&#xff0c;顺利安装上操作系统。 标准2U机架式 配置1个四核英特尔至强处理器E5…

ZTE ME3630 4G模块在Hi3559AV100平台上拨号指令流程

ZTE ME3630 4G模块在Hi3559AV100平台上拨号指令流程 驱动配置 内核版本linux-4.9.37 CONFIG_USB_SERIALy CONFIG_USB_SERIAL_OPTIONy CONFIG_USB_SERIAL_WWANy CONFIG_USB_USBNETy CONFIG_NETDEVICESy CONFIG_USB_NET_CDCETHERy 驱动打印 ~ # usb 1-1:…

【POJ No. 3630】 电话表 Phone List

【POJ No. 3630】 电话表 Phone List 北大OJ 题目地址 【题意】 给出一个电话号码列表&#xff0c;确定它是否满足一致性&#xff08;没有号码是另一个号码的前缀&#xff09;。假设电话目录列出了这些数字&#xff1a;紧急911、爱丽丝97625999、鲍勃91125426&#xff0c;则在…

Phone List POJ - 3630(字典树模板题)

题意 给定 n个长度不超过 10的数字串&#xff0c;问其中是否存在两个数字串S&#xff0c;T &#xff0c;使得 S是 T的前缀&#xff0c;多组数据。 题目 Given a list of phone numbers, determine if it is consistent in the sense that no number is the prefix of anothe…

Linux 线程池

目录 传统艺能&#x1f60e;概念&#x1f60d;线程池应用场景&#x1f618;实现&#x1f923; 静态方法的执行例程&#x1f923;设计任务类型&#x1f601;主线程设计&#x1f602; 传统艺能&#x1f60e; 小编是双非本科大二菜鸟不赘述&#xff0c;欢迎米娜桑来指点江山哦 1…

华为Mate20 HL1HIMAM电路图

华为Mate20 HL1HIMAM手机电路原理图纸 品牌&#xff1a;华为 型号&#xff1a;Mate20 版号 HL1HIMAM 图纸内容&#xff1a;电路图 图纸格式PDF 高清PDF&#xff0c;共56页&#xff0c;可放大缩小&#xff0c;复制搜索 华为Mate20手机图纸–电路原理图

android p矢量壁纸,华为Mate20系列14张高清壁纸“极致AI!”

华为将于今年10月16日在伦敦举行发布会&#xff0c;发布Mate 20系列新品手机。根据此前曝光的官方渲染图&#xff0c;华为Mate20 Pro将采用带刘海的异形曲面全面屏设计&#xff0c;并支持3D结构光技术&#xff0c;同时背面采用“浴霸”造型的三摄像头。现在&#xff0c;关于华为…

华为Mate 20电脑模式说明

华为年度旗舰机Mate 20于10月16日在伦敦发布&#xff0c;Mate 20作为华为超级旗舰&#xff0c;除了自身携带的麒麟980处理器、4200万像素徕卡三摄等顶配&#xff0c;Mate 20还具备双向无线充电和电脑模式功能&#xff0c;可谓亮点十足&#xff0c;下面绿豆就为大家简单介绍下华…