樓教主男人八題之poj1743

2021-06-14 13:25:36 字數 1183 閱讀 8899

這題是學習羅的字尾陣列中看到的,是我寫的字尾陣列的第三題,叫做字尾陣列的簡單應用,可憐我還是弄了半天才解決。

題目大意:尋找串中最長的不重疊的重複子串,給定的整數範圍是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 ...