<题目链接>

题目大意:

输入7e4个长度为9的字符串,每个字符串中只出现0~9这几种数字,现在需要你输出每个母串中最短的特有子串。

解题分析:

利用Trie树进行公共子串的判定,因为Trie树的特性是对节点的前缀字符串进行操作,所以为了转换成对母串中任意区间的字符串进行操作,我们对母串中的所有后缀字符串建树。下面用了一个比较优秀的Trie树模板。

 #include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std; const int N = 7e4+;
const int INF = 1e6;
char buf[N][];
int n,cur;
struct Trie{
int nxt[N*][],num[N*],time[N*];
int root,pos;
int newnode(){
for(int i=;i<;i++)nxt[pos][i]=-;
num[pos]=,time[pos]=;
return pos++;
}
void init(){
pos=;root=newnode();
}
void insert(char str[]){
int len=strlen(str);
int now=root;
for(int i=;i<len;i++){
int to=str[i]-'';
if(nxt[now][to]==-)
nxt[now][to]=newnode();
now=nxt[now][to];
if(time[now]!=cur) //建立时间戳的意义是,避免相同母串中不同位置中的相同子串产生重复标记
num[now]++,time[now]=cur; //num[now]记录下含有这个子串的母串数量
}
}
int query(char str[]){
int len=strlen(str);
int now=root;
for(int i=;i<len;i++){
now=nxt[now][str[i]-''];
if(num[now]==)return i;
}
return -;
}
}trie; int main(){
ios::sync_with_stdio(false);cin.tie();cout.tie();
cin>>n;
trie.init();
for(int i=;i<=n;i++){
cin>>buf[i];
cur=i;
for(int j=;j<;j++){
trie.insert(buf[i]+j); //用每个母串的所有后缀建Trie树,然后利用Trie树对前缀字符串进行操作的特性,达到对母串字符区间的操作
}
}
for(int i=;i<=n;i++){
int le=,ri=,mn=INF;
for(int j=;j<;j++){
int tmp=trie.query(buf[i]+j);
if(tmp!=- && mn>tmp){ //找到每个母串中符合条件的最短子串
mn=tmp;le=j,ri=j+tmp;
}
}
for(int j=le;j<=ri;j++)cout<<buf[i][j];
puts("");
}
}

2019-02-01

最新文章

  1. Firefox默认英文修改中文
  2. go:结构体的可访问性
  3. myBatis+SpringMVC+Maven整合
  4. LIS最长上升子序列O(n^2)与O(nlogn)的算法
  5. Java中MVC详解以及优缺点总结
  6. js笔记——js里的null和undefined
  7. php函数的传值如果需要引用传递注意的细节
  8. 转载 ACM训练计划
  9. jQuery Capty 图片标题插件
  10. 【温故而知新:文件操作】C#的文件读写相关
  11. 利用Windows性能计数器(PerformanceCounter)监控
  12. xcode7,AFN不能使用的问题
  13. java中split(regex)使用中要注意的问题:正则表达式
  14. asp.net core系列 50 Identity 授权(中)
  15. 阿里云服务器部署Java Web项目全过程
  16. thymleaf模板截取日期的年月日,去掉时分秒
  17. Gym - 101911B Glider(前缀和+二分)
  18. No compatible targets were found Do you wish to a add new Android Virtual Device ?
  19. Ubuntu eclipse安装
  20. 【BZOJ3631】松鼠的新家 树链剖分

热门文章

  1. 在DOS中操作MySQL数据库出现中文乱码
  2. SQLPLUS 命令
  3. Confluence 6 管理你的 Confluence 许可证
  4. Vuejs的一些总结
  5. Java语法基础常见疑惑解答8,16,17,21图片补充
  6. 量化投资与Python
  7. python中range()函数的用法
  8. redis 单实例安装
  9. 论文阅读笔记三十二:YOLOv3: An Incremental Improvement
  10. 常见的HTTP响应状态码解析