這題是學習羅的字尾陣列中看到的,是我寫的字尾陣列的第三題,叫做字尾陣列的簡單應用,可憐我還是弄了半天才解決。
題目大意:尋找串中最長的不重疊的重複子串,給定的整數範圍是1-88, 這個最長重複子串有可能是經過置換得到的,置換方法就是加上或減去乙個整數k
解題思路:這裡借用大牛的思路,只需要把串中相鄰兩個的差求出來組成乙個串就能避免置換。
因為原串中經過置換之後能匹配的串,在他們的相鄰差能組成的串中一定能匹配。使用差組成的串構建字尾陣列,計算其height陣列
使用二分法查詢答案
ps:這題資料真水,字尾陣列倍增演算法請詳見 羅穗騫《字尾陣列——處理字串的有力工具》
poj資料的資料太水了,以前的**有錯誤都能過,現在更新了。
//creat time: 2023年05月26日 星期日 15時14分57秒
//file name: poj1743.cpp
//--author--: greedydaam
#include#include#include#include#pragma comment(linker,"/stack:102400000,102400000")//設定棧大小
using namespace std;
#define max 20005
int wa[max],wb[max],ws[max],wv[max];
int rank[max],height[max],str[max],sa[max];
bool cmp(int *r,int a,int b,int l)
void da(int *r,int *sa,int n,int m)
} if(flag)left=mid+1;
else right=mid-1;
} if(right>=4)printf("%d\n",right+1);//這一切都是建立在相鄰差構建的字尾陣列的基礎上,所以如果相鄰差的最大不重疊子串是right那麼真實的答案就應該是right+1
else printf("0\n");//題目要求最小要5個才算
}int main(){
//freopen("input.txt","r",stdin);
int i,t,k,n;
while(scanf("%d",&n),n){
scanf("%d",&t);
for(i=0;i
樓爺八題值poj1743
mmp 什麼二分 也太難了 先記著,回來再寫 wa了30幾發,每天早上醒來都要敲一遍這個題,真是懷疑人生。連續5天,後來發現gcc不能過,c 可以?這,mmp include includeusing namespace std const int m 3e5 7 int x m y m c m s...
POJ 1743 字尾陣列(男人八題七)
有一串音符,輸出最長的兩個不重疊的相似串的長度 如果小於5,則輸出0 相似的意思是兩個串所有字元之差必須一樣。很有意思的一道題。據說可以用hash做,但是hash看了半天都沒看懂,只能用字尾陣列了。剛看到相似的時候我嚇了一跳,不過如果轉化成字元之差的話就舒服多了。我們可以用後乙個字元減去前乙個字元,...
poj1743 字尾陣列入門題
poj1743 include include include include include include include include include include includeusing namespace std define ll long long const int ding ...