POJ 1743 字尾陣列(男人八題七)

2021-08-07 16:24:43 字數 1264 閱讀 4116

有一串音符,輸出最長的兩個不重疊的相似串的長度(如果小於5,則輸出0)。相似的意思是兩個串所有字元之差必須一樣。

很有意思的一道題。據說可以用hash做,但是hash看了半天都沒看懂,只能用字尾陣列了。

剛看到相似的時候我嚇了一跳,不過如果轉化成字元之差的話就舒服多了。我們可以用後乙個字元減去前乙個字元,這樣可以得到乙個差序列。如果兩個差序列相等,則可以認為兩個串相似。

對於這種找最長字串的題,一般的套路就是二分。這裡我們也二分一下長度就可以了。有一點需要注意的是,mx-mn>k,因為處理的是字元之差,如果等於的話,那麼兩個字串的首尾便會重疊,所以不能取到=。

#include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define up(i,l,h) for(int i=l;i#define down(i,h,l) for(int i=h-1;i>=l;i--)

#define w(a) while(a)

#define mem(a,b) memset(a,b,sizeof(a))

#define ll long long

#define inf 0x3f3f3f3f3f3f3f3f

#define maxn 20050

#define mod 1000000007

#define eps 1e-3

using

namespace

std;

int a[maxn];

int sa[maxn],t[maxn],t2[maxn],c[maxn],height[maxn],xrank[maxn],n;

void build_sa(int m)

}void getheight()

}bool good(int k)

}return

false;

}int main()

a[n]=0;

build_sa(200);

getheight();

int l=4,h=n-1,ans=-1;

w(l<=h) else

}printf("%d\n",ans+1);

}}

poj 1743 字尾陣列

字尾陣列,求不可重疊最長重複字串。include include include include include include define maxd 21000 using namespace std int r maxd rank maxd height maxd int sa maxd wa...

POJ 1743 字尾陣列

這裡有一篇 總結了很多字尾陣列的用法,是 字尾陣列 處理字串的有力工具 羅穗騫 裡面又很多關於這個字尾陣列的具體用法,其中就包括這個不可重疊最長重複子串 這個題的意思就是求解不可重疊最長重複子串,但是這裡有乙個問題,他的串中也可以是相似的 每個數之間的差值相同的 那麼我們就可以利用這個差相同的性質,...

POJ 1743(字尾陣列)

給定乙個字串,求最長重複子串,這兩個子串不能重疊。演算法分析 這題比上一題稍複雜一點。先二分答案,把題目變成判定性問題 判斷是否 存在兩個長度為 k 的子串是相同的,且不重疊。解決這個問題的關鍵還是利用height 陣列。把排序後的字尾分成若干組,其中每組的字尾之間的 height 值都不小於 k。...