poj 3450 Corporate Identity
题目链接:http://poj.org/problem?id=3450
题目分类:后缀数组
题意:求n个串的最长公共字串(输出字串)
- //#include<bits/stdc++.h>
- #include<stdio.h>
- #include<math.h>
- #include<algorithm>
- #include<string.h>
- using namespace std;
- #define N 200005
- int wa[N],wb[N],wsf[N],wv[N],sa[N];
- int rank[N],height[N],s[N];
- //sa:字典序中排第i位的起始位置在str中第sa[i]
- //rank:就是str第i个位置的后缀是在字典序排第几
- //height:字典序排i和i-1的后缀的最长公共前缀
- int cmp(int *r,int a,int b,int k)
- {
- return r[a]==r[b]&&r[a+k]==r[b+k];
- }
- void getsa(int *r,int *sa,int n,int m)//n要包含末尾添加的0
- {
- int i,j,p,*x=wa,*y=wb,*t;
- for(i=; i<m; i++) wsf[i]=;
- for(i=; i<n; i++) wsf[x[i]=r[i]]++;
- for(i=; i<m; i++) wsf[i]+=wsf[i-];
- for(i=n-; i>=; i--) sa[--wsf[x[i]]]=i;
- p=;
- j=;
- for(; p<n; j*=,m=p)
- {
- for(p=,i=n-j; i<n; i++) y[p++]=i;
- for(i=; i<n; i++) if(sa[i]>=j) y[p++]=sa[i]-j;
- for(i=; i<n; i++) wv[i]=x[y[i]];
- for(i=; i<m; i++) wsf[i]=;
- for(i=; i<n; i++) wsf[wv[i]]++;
- for(i=; i<m; i++) wsf[i]+=wsf[i-];
- for(i=n-; i>=; i--) sa[--wsf[wv[i]]]=y[i];
- t=x;
- x=y;
- y=t;
- x[sa[]]=;
- for(p=,i=; i<n; i++)
- x[sa[i]]=cmp(y,sa[i-],sa[i],j)? p-:p++;
- }
- }
- void getheight(int *r,int n)//n不保存最后的0
- {
- int i,j,k=;
- for(i=; i<=n; i++) rank[sa[i]]=i;
- for(i=; i<n; i++)
- {
- if(k)
- k--;
- else
- k=;
- j=sa[rank[i]-];
- while(r[i+k]==r[j+k])
- k++;
- height[rank[i]]=k;
- }
- }
- char str[N],ans[N];
- int id[N],vis[];
- bool check(int mid,int n,int k)
- {
- int i,j,cnt = ;
- memset(vis,,sizeof(vis));
- for(i = ; i<=n; i++)
- {
- if(height[i]<mid)
- {
- memset(vis,,sizeof(vis));
- cnt = ;
- continue;
- }
- if(!vis[id[sa[i-]]])
- {
- cnt++;
- vis[id[sa[i-]]] = ;
- }
- if(!vis[id[sa[i]]])
- {
- cnt++;
- vis[id[sa[i]]] = ;
- }
- if(cnt == k)
- {
- for(j = ; j<mid; j++)
- ans[j] = s[sa[i]+j];
- ans[mid] = '\0';
- return ;
- }
- }
- return ;
- }
- int main()
- {
- int n,i,j,k,len;
- while(~scanf("%d",&k),k)
- {
- n = ;
- for(i = ; i<k; i++)
- {
- scanf("%s",str);
- len = strlen(str);
- for(j = ; j<len; j++)
- {
- s[n] = str[j];
- id[n] = i;
- n++;
- }
- s[n] = '#'+i;
- id[n] = '#'+i;
- n++;
- }
- s[n] = ;
- getsa(s,sa,n+,);
- getheight(s,n);
- int l = ,r = len,mid,flag = ;
- while(l<=r)
- {
- mid = (l+r)/;
- if(check(mid,n,k))
- {
- flag = ;
- l=mid+;
- }
- else
- r=mid-;
- }
- if(flag)
- printf("%s\n",ans);
- else
- printf("IDENTITY LOST\n");
- }
- return ;
- }
poj 3450 Corporate Identity的更多相关文章
- POJ 3450 Corporate Identity(KMP)
[题目链接] http://poj.org/problem?id=3450 [题目大意] 求k个字符串的最长公共子串,如果有多个答案,则输出字典序最小的. [题解] 我们对第一个串的每一个后缀和其余所 ...
- POJ 3450 Corporate Identity (KMP,求公共子串,方法很妙)
http://blog.sina.com.cn/s/blog_74e20d8901010pwp.html我采用的是方法三. 注意:当长度相同时,取字典序最小的. #include <iostre ...
- POJ 3450 Corporate Identity kmp+最长公共子串
枚举长度最短的字符串的所有子串,再与其他串匹配. #include<cstdio> #include<cstring> #include<algorithm> #i ...
- POJ 3450 Corporate Identity (KMP+暴搞)
题意: 给定N个字符串,寻找最长的公共字串,如果长度相同,则输出字典序最小的那个. 找其中一个字符串,枚举它的所有的字串,然后,逐个kmp比较.......相当暴力,可二分优化. #include & ...
- POJ 3450 Corporate Identity KMP解决问题的方法
这个问题,需要一组字符串求最长公共子,其实灵活运用KMP高速寻求最长前缀. 请注意,意大利愿父亲:按照输出词典的顺序的规定. 另外要提醒的是:它也被用来KMP为了解决这个问题,但是很多人认为KMP使用 ...
- POJ 题目3450 Corporate Identity(KMP 暴力)
Corporate Identity Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 5493 Accepted: 201 ...
- poj 3518 Corporate Identity 后缀数组->多字符串最长相同连续子串
题目链接 题意:输入N(2 <= N <= 4000)个长度不超过200的字符串,输出字典序最小的最长公共连续子串; 思路:将所有的字符串中间加上分隔符,注:分隔符只需要和输入的字符不同, ...
- 字符串截取模板 && POJ 3450、3080 ( 暴力枚举子串 && KMP匹配 )
//截取字符串 ch 的 st~en 这一段子串返回子串的首地址 //注意用完需要根据需要最后free()掉 char* substring(char* ch,int st,int en) { ; c ...
- POJ - 3450
题目链接:http://poj.org/problem?id=3450 Corporate Identity Time Limit: 3000MS Memory Limit: 65536K Tot ...
随机推荐
- JRE 和 JDK 的区别是什么?
JRE: Java Runtime Environment JDK:Java Development Kit JRE顾名思义是java运行时环境,包含了java虚拟机,java基础类库.是使用java ...
- 修改VISUAL STUDIO EXPRESS 2012新建C++文件编码
本站文章除注明转载外,均为本站原创或者翻译. 本站文章欢迎各种形式的转载,但请18岁以上的转载者注明文章出处,尊重我的劳动,也尊重你的智商: 本站部分原创和翻译文章提供markdown格式源码,欢迎使 ...
- Javascript面向对象研究心得
这段时间正好公司项目须要,须要改动fullcalendar日历插件,有机会深入插件源代码.正好利用这个机会,我也大致学习了下面JS的面向对象编程,感觉收获还是比較多的. 所以写了以下这篇文章希望跟大家 ...
- KVM虚拟机介绍
一 KVM虚拟机简介 kernel-based Virtual Machine的简称,是一个开源的 系统虚拟化模块,自Linux 2.6.20之后集成在Linux的各个主要发行版本中.它使用Linux ...
- K&R练习题6-1统计关键词出现的次数
这道练习题训练了: 1.结构体数组 2.二分查找 3.指针操作 ---- 都不难.但非常基础,我认为非常好,做完了记到博客上来,题目见k&R,实现例如以下: /* * Practice of ...
- MySql连接问题
今天想通过命令连接到另外一台主机的Mysql 命令: mysql -h ip -u username -p EnterPassWord: password 连接成功
- MFC常用控件CListCtrl 、CSliderCtrl、CToolTipCtrl、CTreeCtrl的自绘
Window平台下MFC提供的CListCtrl .CSliderCtrl.CToolTipCtrl.CTreeCtrl等控件大多时候是不能满足我们的需求,如果我要在改变滑动条的颜色,我要改变滑动条的 ...
- 简单区分`:before`与`::before`的区别
简单区分:before与::before的区别 :hover我们都知道,称作伪类,英文名pseudo-class,而我们此处提到的:before以及:after也是伪类,属于css2的内容,在ie8下 ...
- 【linux】内核编译
原创,转载时请注明,谢谢.邮箱:tangzhongp@163.com 博客园地址:http://www.cnblogs.com/embedded-tzp Csdn博客地址:http://blog.cs ...
- PHP 页面跳转到另一个页面的几种方法分享
如何在 PHP 中从一个页面重定向到另外一个页面呢?今天 清源 为大家列举出了三种办法,供大家来参考. 一.用HTTP头信息 也就是用PHP的HEADER函数.PHP里的HEADER函数的作用就是向 ...