poj2774(后缀数组水题)
http://poj.org/problem?id=2774
题意:给你两串字符,要你找出在这两串字符中都出现过的最长子串.........
思路:先用个分隔符将两个字符串连接起来,再用后缀数组求出height数组的值,找出一个height值最大并且i与i-1的sa值分别在两串字符中就好.....
- #include<iostream>
- #include<stdio.h>
- #include<string.h>
- using namespace std;
- #define min(x,y) x>y? y:x
- #define maxn 200010
- int dp[maxn][33];
- int wa[maxn],wb[maxn],wsf[maxn],wv[maxn],sa[maxn];
- int rank[maxn],height[maxn],s[maxn];
- char str[maxn],str1[maxn];
- 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)
- {
- int i,j,p,*x=wa,*y=wb,*t;
- for(i=0;i<m;i++) wsf[i]=0;
- for(i=0;i<n;i++) wsf[x[i]=r[i]]++;
- for(i=1;i<m;i++) wsf[i]+=wsf[i-1];
- for(i=n-1;i>=0;i--) sa[--wsf[x[i]]]=i;
- p=1;
- j=1;
- for(;p<n;j*=2,m=p)
- {
- for(p=0,i=n-j;i<n;i++) y[p++]=i;
- for(i=0;i<n;i++) if(sa[i]>=j) y[p++]=sa[i]-j;
- for(i=0;i<n;i++) wv[i]=x[y[i]];
- for(i=0;i<m;i++) wsf[i]=0;
- for(i=0;i<n;i++) wsf[wv[i]]++;
- for(i=1;i<m;i++) wsf[i]+=wsf[i-1];
- for(i=n-1;i>=0;i--) sa[--wsf[wv[i]]]=y[i];
- t=x;
- x=y;
- y=t;
- x[sa[0]]=0;
- for(p=1,i=1;i<n;i++)
- x[sa[i]]=cmp(y,sa[i-1],sa[i],j)? p-1:p++;
- }
- }
- void getheight(int *r,int n)
- {
- int i,j,k=0;
- for(i=1;i<=n;i++) rank[sa[i]]=i;
- for(i=0;i<n;i++)
- {
- if(k)
- k--;
- else
- k=0;
- j=sa[rank[i]-1];
- while(r[i+k]==r[j+k])
- k++;
- height[rank[i]]=k;
- }
- }
- int main()
- {
- while(scanf("%s",str)>0)
- {
- scanf("%s",str1);
- int n=0,len=strlen(str);
- for(int i=0;i<len;i++)
- s[n++]=str[i]-'a'+1;
- s[n++]=28;
- len=strlen(str1);
- for(int i=0;i<len;i++)
- s[n++]=str1[i]-'a'+1;
- s[n]=0;
- getsa(s,sa,n+1,30);
- getheight(s,n);
- int maxx=0,pos=0;
- len=strlen(str);
- for(int i=2;i<n;i++)
- if(height[i]>maxx)
- {
- if(0<=sa[i-1]&&sa[i-1]<len&&len<sa[i])
- maxx=height[i];
- if(0<=sa[i]&&sa[i]<len&&len<sa[i-1])
- maxx=height[i];
- }
- printf("%d\n",maxx);
- }
- return 0;
- }
poj2774(后缀数组水题)的更多相关文章
- POJ2774 & 后缀数组模板题
题意: 求两个字符串的LCP SOL: 模板题.连一起搞一搞就好了...主要是记录一下做(sha)题(bi)过程心(cao)得(dan)体(xin)会(qing) 后缀数组概念...还算是简单的,过程 ...
- Distinct Substrings SPOJ - DISUBSTR(后缀数组水题)
求不重复的子串个数 用所有的减去height就好了 推出来的... #include <iostream> #include <cstdio> #include <sst ...
- BZOJ 1031 [JSOI2007]字符加密Cipher | 后缀数组模板题
BZOJ 1031 [JSOI2007]字符加密Cipher | 后缀数组模板题 将字符串复制一遍接在原串后面,然后后缀排序即可. #include <cmath> #include &l ...
- POJ 2774 Long Long Message 后缀数组模板题
题意 给定字符串A.B,求其最长公共子串 后缀数组模板题,求出height数组,判断sa[i]与sa[i-1]是否分属字符串A.B,统计答案即可. #include <cstdio> #i ...
- BZOJ 3172([Tjoi2013]单词-后缀数组第一题+RMQ)
3172: [Tjoi2013]单词 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 268 Solved: 145 [ Submit][ St ...
- Lightoj 1112 - Curious Robin Hood 【单点改动 + 单点、 区间查询】【树状数组 水题】
1112 - Curious Robin Hood PDF (English) Statistics Forum Time Limit: 1 second(s) Memory Limit: 64 MB ...
- poj2774 后缀数组2个字符串的最长公共子串
Long Long Message Time Limit: 4000MS Memory Limit: 131072K Total Submissions: 26601 Accepted: 10 ...
- poj 2774 Long Long Message 后缀数组基础题
Time Limit: 4000MS Memory Limit: 131072K Total Submissions: 24756 Accepted: 10130 Case Time Limi ...
- 后缀数组(模板题) - 求最长公共子串 - poj 2774 Long Long Message
Language: Default Long Long Message Time Limit: 4000MS Memory Limit: 131072K Total Submissions: 21 ...
随机推荐
- SpringMVC使用ModelAndView进行重定向
1.Servlet重定向forward与redirect: 使用servlet重定向有两种方式,一种是forward,另一种就是redirect.forward是服务器内部重定向,客户端并不知道服务器 ...
- php 获得linux 机器的性能
<?php $str = shell_exec('more /proc/stat'); $pattern = "/(cpu[0-9]? )[\s]+([0-9]+)[\s]+([0-9 ...
- [Compose] 17. List comprehensions with Applicative Functors
We annihilate the need for the ol' nested for loop using Applicatives. For example we have this kind ...
- 【Python】安装Python的mysql模块
在控制台中输入pip install pymysql即可,以下是输出: C:\Users\horn1\Desktop\python\15>pip install pymysql Collecti ...
- 在linux下安装mysql
1.下载mysql 下载地址: http://dev.mysql.com/downloads/mysql/5.5.html#downloads 2.进入系统后,检测是否安装mysql #rpm -qa ...
- Java静态变量的初始化(static块的本质)
Java静态变量的初始化(static块的本质) 标签: javaclassstring编译器jdk工作 2010-02-06 07:23 33336人阅读 评论(16) 收藏 举报 分类: Jav ...
- 【bat】通过for循环复制一张图片100次
代码如下: @echo off set "F=1" cd C:\Users\Thinkpad\Desktop\img for /L %%F IN (1,1,100) DO COPY ...
- 【Linux】cat命令
用途 cat用于将一个档案的内容连续的打印在屏幕上 全称 cat的全称是Conctaenate 参数 -A :相当于-vTE的整合选项,可列出一些特殊字符而不是空白而已 -b :列出行号,仅针对非空白 ...
- C# 实体集合和实体转换成相应的string、XDocument、XElement、XDocument
https://msdn.microsoft.com/zh-cn/library/system.xml.linq.xelement(v=vs.110).aspx XElement.Parse 方法 ( ...
- js同域名下不同文件下使用coookie
//写cookies function setCookie(name,value) { var Days = 30; var exp = new Date(); exp.setTime(exp.get ...