tire树暴力--找最短唯一的电话号码标识符

http://codeforces.com/problemset/problem/858/D---》原题

 一句话概括题意:在输入的所有电话号码中输出每一个号码的最短的特有的标识符(就是一段子串只在此电话号中有在其他号码中没有)

 看完题解大部分都用的什么时间戳,看不懂,就采用了复杂一点但好理解的,抵消-寻找-还原 的三步走战略。但是还是调了好长时间的bug,因为一般的tire树只需要将所有的字符串依次插入到tire树中一次便可,而此题需要将每个电话号的0~8位,1~8位,2~8位,,,,,7~8位,8位依次插入到tire树中,正因为忽略了此要点,所以tire数组开小了。看代码

#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
struct Tire {int num;//记录树中每个节点出现的次数int next_s[15];Tire(){num=1;memset(next_s,-1,sizeof(next_s));}
}tire[1000000];//数组大小要远大于70000*9 
ll cnt=0;
char str[70005][15];
void insert(int s,int id){//传进的参数表示&str[id][s]. int p=0;for(int i=s;str[id][i]!='\0';i++){if(tire[p].next_s[str[id][i]-'0']==-1){tire[p].next_s[str[id][i]-'0']=++cnt;p=cnt;}else{p=tire[p].next_s[str[id][i]-'0'];tire[p].num++;}}
}
ll LEN,BEGIN;
//寻找 
void find(ll s,ll id){int p=0;for(int i=s;str[id][i]!='\0';i++){//此if可有可无---剪枝 if(tire[p].next_s[str[id][i]-'0']==-1){return ;}p=tire[p].next_s[str[id][i]-'0'];if(tire[p].num==0){//抵消后第一个num==0的点说明此后缀的前缀是s~i独有的子串 if(i-s

 

 


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部