惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

WordPress大学
WordPress大学
Microsoft Security Blog
Microsoft Security Blog
Security Archives - TechRepublic
Security Archives - TechRepublic
V
Visual Studio Blog
宝玉的分享
宝玉的分享
IT之家
IT之家
人人都是产品经理
人人都是产品经理
T
The Blog of Author Tim Ferriss
I
InfoQ
B
Blog RSS Feed
T
Threatpost
博客园_首页
M
MIT News - Artificial intelligence
Spread Privacy
Spread Privacy
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Know Your Adversary
Know Your Adversary
U
Unit 42
Engineering at Meta
Engineering at Meta
C
Cyber Attacks, Cyber Crime and Cyber Security
月光博客
月光博客
Scott Helme
Scott Helme
T
Tor Project blog
有赞技术团队
有赞技术团队
AWS News Blog
AWS News Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Last Week in AI
Last Week in AI
S
Schneier on Security
Vercel News
Vercel News
博客园 - Franky
C
Cybersecurity and Infrastructure Security Agency CISA
L
LINUX DO - 热门话题
NISL@THU
NISL@THU
L
LangChain Blog
爱范儿
爱范儿
Google DeepMind News
Google DeepMind News
The GitHub Blog
The GitHub Blog
雷峰网
雷峰网
Latest news
Latest news
C
CXSECURITY Database RSS Feed - CXSecurity.com
Hugging Face - Blog
Hugging Face - Blog
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
www.infosecurity-magazine.com
www.infosecurity-magazine.com
G
GRAHAM CLULEY
S
Security Affairs
A
About on SuperTechFans
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
大猫的无限游戏
大猫的无限游戏
W
WeLiveSecurity
Cisco Talos Blog
Cisco Talos Blog
罗磊的独立博客

博客园 - xmx

Amazon 2面杯具 N皇后回溯 "中航文化杯" 2007 ACM/ICPC 国际大学生程序设计竞赛亚洲区域赛(南京) 一个用来练dfs的简单迷宫问题 pku 1662 还是找规律的 pku 1806 Manhattan 2025(找规律) 今天西华的比赛,啥都不说啦,相当的nice!~~~ 今天北京赛区的比赛 pku 1505 copying books(DP) 最近看的一些东西 The 2007 ACM Asia Programming Contest Changchun Site Internet Preliminary Contest nice 位运算果真是好东西,今天算是学到点啦^_^ FOJ月赛-2007年9月 pku 1850 前面一直没注意到某个不规范的情况,导致结果一直比标准的大...调了好久... The 2007 ACM Asia Programming Contest - Nanjing Preliminary pku 3219 人家居然用几十B就过了,肯定有超强的规律,可是我自己找了个,挂了...只能老实算... 一道双向dp,差点超时^_^||| dp pku 1050 N和素数P,求杨辉三角第N行中能被P整除的数的个数
终于有算最长重复子串(数)的后缀数组啦,nice
xmx · 2007-09-30 · via 博客园 - xmx

#include <cstdio>
#include <string>
#include <algorithm>
using namespace std;

const int MAX = 25000;

  1#include <cstdio>
  2#include <string>
  3#include <algorithm>
  4using namespace std;
  5
  6const int MAX = 25000;
  7int num[MAX];
  8int mem[3][MAX], c[MAX];
  9int * SA, * Rank, * nSA, * nRank;
 10int n,kk,nmax;
 11
 12void make_sa()
 13{
 14    int i,j;
 15    SA = mem[0]; Rank = mem[1]; nSA = mem[2];
 16    memset(c,0,sizeof(c));
 17    for(i=0;i<n;i++{
 18        c[ num[i] +1++;
 19    }

 20    for(i=1;i<=nmax+1;i++{
 21        c[i] += c[i-1];
 22    }

 23    for(i=0;i<n;i++{
 24        SA[ --c[ num[i] +1] ] = i;
 25    }

 26    Rank[ SA[0] ] = 0;
 27    for(i=1;i<n;i++{
 28        Rank[SA[i]] = Rank[SA[i-1]];
 29        if(num[SA[i]] != num[SA[i-1]]) {
 30            Rank[SA[i]] ++;
 31        }

 32    }

 33
 34    int k;
 35    for(k=1;k<&& Rank[ SA[n-1] ] < n-1;k*=2{
 36        memset(c,0,sizeof(c));
 37        for(i=0;i<n;i++{
 38            c[ Rank[SA[i]] ] ++;
 39        }

 40        for(i=1;i<n;i++{
 41            c[i] += c[i-1];
 42        }

 43        for(i=n-1;i>=0;i--{
 44            if(SA[i] >= k) {
 45                nSA[ -- c[ Rank[SA[i]-k] ] ] = SA[i] - k;
 46            }

 47        }

 48        for(i=n-k;i<n;i++{
 49            nSA[ -- c[Rank[i]] ] = i;
 50        }

 51        nRank = SA;
 52        nRank[ nSA[0] ] = 0;
 53        for(i=1;i<n;i++{
 54            nRank[ nSA[i] ] = nRank[ nSA[i-1] ];
 55            if(Rank[nSA[i]] != Rank[nSA[i-1]] || Rank[nSA[i]+k] != Rank[nSA[i-1]+k]) {
 56                nRank[ nSA[i] ] ++;
 57            }

 58        }

 59        SA = nSA;
 60        nSA = Rank;
 61        Rank = nRank;
 62    }

 63}

 64
 65int h[MAX];
 66int get_lcp()
 67{
 68    int i,j,k;
 69    
 70    for(i=0,k=0;i<n;i++{
 71        if(Rank[i] == n-1{
 72            h[ Rank[i] ] = k = 0;
 73        }

 74        else {
 75            if(k > 0{
 76                k --;
 77            }

 78            j = SA[Rank[i] +1];
 79            while(num[i+k] == num[j+k]) {
 80                k ++;
 81            }

 82            h[ Rank[i] ] = k;
 83        }

 84    }

 85    int ret = 0;
 86    kk --;
 87    for(i=0;i<n-kk;i++{
 88        int t = INT_MAX;
 89        for(j=0;j<kk;j++{
 90            t = min(t, h[i+j]);
 91        }

 92        ret = max(t, ret);
 93    }

 94    return ret;
 95}

 96
 97int main()
 98{
 99    int i,j;
100    while(scanf("%d %d"&n,&kk)==2{
101        nmax = -1;
102        for(i=0;i<n;i++{
103            scanf("%d", num+i);
104            nmax = max(nmax, num[i]);
105        }

106        num[n ++= -1;
107        make_sa();
108        printf("%d\n", get_lcp());
109    }

110}

111