有一串音符,輸出最長的兩個不重疊的相似串的長度(如果小於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。...