【HDOJ】2459 Maximum repetition substring

摘要:
后缀数组+RMQ。p-1:p++;73}74}7576空隙高度(int*r,int*sa,intn){77inti,j,k=0;7879(i=1;i˂=n;++i)rrank[sa[i]=i;80(i=0;i˂n;高度[rrank[i++]=k)81(k?

后缀数组+RMQ。

  1 /* 2459 */
  2 #include <iostream>
  3 #include <sstream>
  4 #include <string>
  5 #include <map>
  6 #include <queue>
  7 #include <set>
  8 #include <stack>
  9 #include <vector>
 10 #include <deque>
 11 #include <algorithm>
 12 #include <cstdio>
 13 #include <cmath>
 14 #include <ctime>
 15 #include <cstring>
 16 #include <climits>
 17 #include <cctype>
 18 #include <cassert>
 19 #include <functional>
 20 #include <iterator>
 21 #include <iomanip>
 22 using namespace std;
 23 //#pragma comment(linker,"/STACK:102400000,1024000")
 24 
 25 #define sti                set<int>
 26 #define stpii            set<pair<int, int> >
 27 #define mpii            map<int,int>
 28 #define vi                vector<int>
 29 #define pii                pair<int,int>
 30 #define vpii            vector<pair<int,int> >
 31 #define rep(i, a, n)     for (int i=a;i<n;++i)
 32 #define per(i, a, n)     for (int i=n-1;i>=a;--i)
 33 #define clr                clear
 34 #define pb                 push_back
 35 #define mp                 make_pair
 36 #define fir                first
 37 #define sec                second
 38 #define all(x)             (x).begin(),(x).end()
 39 #define SZ(x)             ((int)(x).size())
 40 #define lson            l, mid, rt<<1
 41 #define rson            mid+1, r, rt<<1|1
 42 
 43 const int INF = 0x3f3f3f3f;
 44 const int maxn = 1e5+5;
 45 char s[maxn];
 46 int a[maxn];
 47 int rrank[maxn], height[maxn], sa[maxn];
 48 int wa[maxn], wb[maxn], wc[maxn], wv[maxn];
 49 int dp[maxn][17];
 50 int mx[maxn], L[maxn];
 51 
 52 bool cmp(int *r, int a, int b, int l) {
 53     return r[a]==r[b] && r[a+l]==r[b+l];
 54 }
 55 
 56 void da(int *r, int *sa, int n, int m) {
 57     int i, j, *x=wa, *y=wb, *t, p;
 58     
 59     for (i=0; i<m; ++i) wc[i] = 0;
 60     for (i=0; i<n; ++i) wc[x[i]=r[i]]++;
 61     for (i=1; i<m; ++i) wc[i] += wc[i-1];
 62     for (i=n-1; i>=0; --i) sa[--wc[x[i]]] = i;
 63     for (j=1,p=1; p<n; j*=2, m=p) {
 64         for (p=0,i=n-j; i<n; ++i) y[p++] = i;
 65         for (i=0; i<n; ++i) if (sa[i] >= j) y[p++] = sa[i] - j;
 66         for (i=0; i<n; ++i) wv[i] = x[y[i]];
 67         for (i=0; i<m; ++i) wc[i] = 0;
 68         for (i=0; i<n; ++i) wc[x[i]]++;
 69         for (i=1; i<m; ++i) wc[i] += wc[i-1];
 70         for (i=n-1; i>=0; --i) sa[--wc[wv[i]]] = y[i];
 71         for (t=x, x=y, y=t, p=1, i=1, x[sa[0]]=0; i<n; ++i)
 72             x[sa[i]] = cmp(y, sa[i-1], sa[i], j) ? p-1 : p++;
 73     }
 74 }
 75 
 76 void calheight(int *r, int *sa, int n) {
 77     int i, j, k = 0;
 78     
 79     for (i=1; i<=n; ++i) rrank[sa[i]] = i;
 80     for (i=0; i<n; height[rrank[i++]]=k)
 81     for (k?k--:0, j=sa[rrank[i]-1]; r[j+k]==r[i+k]; ++k) ;
 82 }
 83 
 84 void init_RMQ(int n) {
 85     int i, j;
 86     
 87     for (i=1; i<=n; ++i)
 88         dp[i][0] = height[i];
 89     dp[1][0] = INF;
 90     for (j=1; (1<<j)<=n; ++j)
 91         for (i=1; i+(1<<j)-1<=n; ++i)
 92             dp[i][j] = min(dp[i][j-1], dp[i+(1<<(j-1))][j-1]);
 93 }
 94 
 95 int RMQ(int l, int r) {
 96     if (l > r)
 97         swap(l, r);
 98     
 99     int k = 0;
100     ++l;
101     while (1<<(k+1) <= r-l+1)
102         ++k;
103     
104     return min(dp[l][k], dp[r-(1<<k)+1][k]);
105 }
106 
107 void printSa(int n) {
108     for (int i=1; i<=n; ++i)
109         printf("%d ", sa[i]);
110     putchar('
');
111 }
112 
113 void printHeight(int n) {
114     for (int i=1; i<=n; ++i)
115         printf("%d ", height[i]);
116     putchar('
');
117 }
118 
119 void solve() {
120     int n;
121     
122     for (int i=0; ; ++i) {
123         if (s[i] == '

免责声明:内容来源于网络,仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇【POJ】3415 Common Substrings【HDOJ】2890 Longest Repeated subsequence下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

linux下wc功能的简单实现

1.代码来源:自己编写 2.运行环境:linux终端 3.编程语言:c/c++语言 4.bug:未发现 5.当前功能:可以统计字符的字符数、行数、单词数 6.使用方法:wc -l 文件名-->统计行数、wc -w 文件名-->统计但词数、wc -c 文件名-->统计字符数 7.gitbub代码地址:https://github.com/mo...

2018-2019-1 20165330 实验三 实时系统

任务一 任务详情 学习使用Linux命令wc(1) 基于Linux Socket程序设计实现wc(1)服务器(端口号是你学号的后6位)和客户端 客户端传一个文本文件给服务器 服务器返加文本文件中的单词数 实现wc命令 命令参数 -c:统计字节数 -l:统计行数 -m:统计字符数。这个标志不能与 -c 标志一起使用。 -w:统计字数。一个字被定...

centos查看系统配置信息

1、linux查看版本当前操作系统发行信息 cat /etc/centos-release  2、查看内核版本uname -a或者cat /proc/version  3、查看CPU参数 1)、查看 CPU 物理个数  grep 'physical id' /proc/cpuinfo | sort -u | wc -l2)、查看 CPU 核心数量  ...

忘记SQL SERVER密码的解决

见 http://www.cnblogs.com/jiang_zheng/archive/2009/02/05/1384622.html 1======== 在cmd 窗口下 C:\Documents and Settings\Administrator>osql -E 1> sp_password null,'abc123','sa' 2>...

2017-2018-1 20145237 《信息安全系统设计基础》实验三 实时系统

实验一: 学习使用Linux命令wc(1) 基于Linux Socket程序设计实现wc(1)服务器(端口号是你学号的后6位)和客户端 客户端传一个文本文件给服务器 服务器返加文本文件中的单词数 上方提交代码 附件提交测试截图,至少要测试附件中的两个文件 (二)并发程序 使用多线程实现wc服务器并使用同步互斥机制保证计数正确...

linux中,查看某个进程打开的文件数?

需求描述:   今天在处理一个问题的时候,涉及到查看某个进程打开的文件数,在此记录下. 操作过程: 1.通过lsof命令查看某个特定的进程打开的文件数 [root@hadoop3 ~]# lsof -p 1296 | wc -l 58 备注:通过lsof命令,加上-p选项,后面接对应的进程PID,然后通过wc -l进行统计,就能知道某个进...