POJ 1225 Substrings
http://poj.org/problem?id=1226
题意:给定n个串。求一个最长的串,使得这个串或者其反串在每个串中都出现过?
思路:先在大串里面加入正反串,然后二分,判定即可。
- #include<cstdio>
- #include<iostream>
- #include<cmath>
- #include<cstring>
- #include<algorithm>
- int num[],ws[],wv[],wb[],wa[];
- int n,m,rank[],sa[],h[],b[];
- int read(){
- int t=,f=;char ch=getchar();
- while (ch<''||ch>''){if (ch=='-')f=-;ch=getchar();}
- while (''<=ch&&ch<=''){t=t*+ch-'';ch=getchar();}
- return t*f;
- }
- bool cmp(int *r,int a,int b,int l){
- return r[a]==r[b]&&r[a+l]==r[b+l];
- }
- void da(int *r,int *sa,int n,int m){
- int *y=wb,*x=wa,*t,i,j,p;
- for (i=;i<m;i++) ws[i]=;
- for (i=;i<n;i++) x[i]=r[i];
- for (i=;i<n;i++) ws[x[i]]++;
- for (i=;i<m;i++) ws[i]+=ws[i-];
- for (i=n-;i>=;i--) sa[--ws[x[i]]]=i;
- for (p=,j=;p<n;m=p,j*=){
- 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<m;i++) ws[i]=;
- for (i=;i<n;i++) wv[i]=x[y[i]];
- for (i=;i<n;i++) ws[wv[i]]++;
- for (i=;i<m;i++) ws[i]+=ws[i-];
- for (i=n-;i>=;i--) sa[--ws[wv[i]]]=y[i];
- for (t=x,x=y,y=t,i=,p=,x[sa[]]=;i<n;i++)
- x[sa[i]]=cmp(y,sa[i],sa[i-],j)?p-:p++;
- }
- }
- void cal(int *r,int n){
- int i,j,k=;
- for (i=;i<=n;i++) rank[sa[i]]=i;
- for (i=;i<n;h[rank[i++]]=k)
- for (k?k--:,j=sa[rank[i]-];r[i+k]==r[j+k];k++);
- }
- bool check(int x){
- int L,R;
- int hash[];
- for (int i=;i<=n;i++){
- L=i;
- while (L<=n&&h[L]<x) L++;
- if (L>n) break;
- R=L;
- while (R<=n&&h[R]>=x) R++;
- memset(hash,,sizeof hash);
- for (int j=L-;j<=R-;j++)
- if (b[sa[j]]<=m)
- hash[b[sa[j]]]=;
- int j=;
- for (j=;j<=m;j++)
- if (!hash[j]) break;
- if (j>m) return ;
- i=R;
- }
- return ;
- }
- void solve(){
- int l=,r=,ans;
- while (l<=r){
- int mid=(l+r)>>;
- if (check(mid)) ans=mid,l=mid+;
- else r=mid-;
- }
- printf("%d\n",ans);
- }
- int main(){
- int T=read();
- char s[];
- while (T--){
- m=read();n=;int sx=;
- for (int i=;i<=m;i++){
- scanf("%s",s);
- int len=strlen(s);
- for (int j=;j<len;j++)
- num[n]=s[j],b[n++]=i;
- num[n]=sx++;b[n++]=n+;
- for (int j=len-;j>=;j--)
- num[n]=s[j],b[n++]=i;
- num[n]=sx++;b[n++]=n+;
- }
- num[n]=;b[n]=n+;
- da(num,sa,n+,sx+);
- cal(num,n);
- solve();
- }
- }
POJ 1225 Substrings的更多相关文章
- OpenJudge/Poj 1226 Substrings
1.链接地址: http://bailian.openjudge.cn/practice/1226/ http://poj.org/problem?id=1226 2.题目: 总时间限制: 1000m ...
- POJ 1226 Substrings(后缀数组+二分答案)
[题目链接] http://poj.org/problem?id=1226 [题目大意] 求在每个给出字符串中出现的最长子串的长度,字符串在出现的时候可以是倒置的. [题解] 我们将每个字符串倒置,用 ...
- POJ 1226 Substrings
Substrings Time Limit: 1000ms Memory Limit: 10000KB This problem will be judged on PKU. Original ID: ...
- POJ - 1226 Substrings (后缀数组)
传送门:POJ - 1226 这个题跟POJ - 3294 和POJ - 3450 都是一样的思路,一种题型. POJ - 3294的题解可以见:https://www.cnblogs.com/li ...
- 后缀自动机(SAM)
*在学习后缀自动机之前需要熟练掌握WA自动机.RE自动机与TLE自动机* 什么是后缀自动机 后缀自动机 Suffix Automaton (SAM) 是一个用 O(n) 的复杂度构造,能够接受一个字符 ...
- KUANGBIN带你飞
KUANGBIN带你飞 全专题整理 https://www.cnblogs.com/slzk/articles/7402292.html 专题一 简单搜索 POJ 1321 棋盘问题 //201 ...
- kuangbin带你飞 后缀数组 题解
2份模板 DC3 . 空间复杂度O3N 时间复杂度On #define F(x) ((x) / 3 + ((x) % 3 == 1 ? 0 : tb)) #define G(x) ((x) < ...
- [kuangbin带你飞]专题1-23题目清单总结
[kuangbin带你飞]专题1-23 专题一 简单搜索 POJ 1321 棋盘问题POJ 2251 Dungeon MasterPOJ 3278 Catch That CowPOJ 3279 Fli ...
- 后缀自己主动机(SAM)学习指南
*在学习后缀自己主动机之前须要熟练掌握WA自己主动机.RE自己主动机与TLE自己主动机* 什么是后缀自己主动机 后缀自己主动机 Suffix Automaton (SAM) 是一个用 O(n) 的复杂 ...
随机推荐
- css属性之!important
提升指定样式规则的应用优先权. IE6及以下浏览器有个比较显式的支持问题存在,!important在同一条规则集里不生效.请看下述代码: div { color: #f00 !important; c ...
- HDU_2015——偶数求和
Problem Description 有一个长度为n(n<=100)的数列,该数列定义为从2开始的递增有序偶数,现在要求你按照顺序每m个数求出一个平均值,如果最后不足m个,则以实际数量求平均值 ...
- 高德JAVA笔试题
1.常用的RuntimeException. 2.叙述RuntimeException和一般异常的异同. 3.叙述ArrayList.Vector和LinkedList各自的特点和特性. 4.什么是反 ...
- B - Network - uva 315(求割点)
题意:给一个无向连通图,求出割点的数量. 首先输入一个N(多实例,0结束),下面有不超过N行的数,每行的第一个数字代表后面的都和它存在边,0表示行输入的结束(很蛋疼的输入方式). 分析:割点的模板题 ...
- 取得select框的text
function selectInput(choose) { alert(choose.options[choose.selectedIndex].text); }
- 关闭myeclipse中jsp的校验功能
window--->preference--->Myeclipse--->Validation,取消下图红框中的选中状态.
- SAN和NAS的区别
SAN : STORAGE AREA NETWORK 存储区域网络 NAS : NETWORK ATTACHED STORAGE 网络附加存储 NAS不一定是盘阵,一台普通的主机就可以做出NAS, ...
- source insight3.5中文乱码解决方案
source insight3.5中文乱码,网上看别人说改变宽字体.宋体等方法都不起效.根本原因是,source insight 3.5 不支持Unicode编码,所以导致中文的乱码,将文件转为gb2 ...
- C#和.NET Framework
.NET Framework概述 .NET Framework是由微软开发,一个致力于敏捷软件开发.快速应用开发.平台无关性和网络透明化的软件开发平台. .NET Framework组成 .NET F ...
- 【socket.io研究】0.前提准备
WebSocket出现之前,web实时推送,一般采用轮询和Comet技术(可细分为长轮询机制和流技术两种),需要大量http请求,服务器受不了.HTML5定义了WebSocket协议,基于TCP协议, ...