manachar演算法小結

2022-04-01 02:38:22 字數 3069 閱讀 7246

1.hdu--4513 吉哥系列故事——完美隊形ii

題意:中文題不解釋

思路:數字型的manachar演算法。將模板中的比較字元改為比較數字就行了。

ac**:

1 #include 2 #include3 #include4 #include 5 #include 6

using

namespace

std;

7int a[200005],p[200005],k[200005];8

int manachar(int

len)925

if(p[i]>maxn)

26 maxn=p[i];27}

28 printf("

%d\n

",maxn-1

);29

return0;

30}31int

main()

3250

else

51 k[i*2+2]++;

52//

printf("%d %d\n",i*2+2,k[i*2+2]);53}

54 manachar(2*n+2

);55}56

}57return0;

58 }

view code

2.hdu--3294 girls' research

題意:先輸入乙個字元ch表示該字元的real是『a』,迴圈對應的ch-1的real是『z』,再輸入乙個字串,求這個字串real值的最大回文串,如果有多個結果輸出第乙個。輸出最大回文串的左端點值和右端點值,如果回文串長度是1的話列印「no solution!」

思路:先把給的字串改成real串,再求最大回文串,並記錄real串的左右端點。

ac**:

1 #include 2 #include3 #include 4 #include 5 #include 6

using

namespace

std;

7char ch,s[200005],str[400005];8

int p[400005];9

int manachar(int

len)

1027}28

if(maxn

2933

}34 maxn--;

35if(maxn<3

)36 printf("

no solution!\n");

37else

3844

return0;

45}46int

main()

4762 str[len*2+2]='\0'

;63 manachar(len*2+2

);64}65

return0;

66 }

view code

3.hdu--3613 best reward

題意:先輸入『a』~『z』的價值,然後給出乙個字串,問把這個字串分成兩部分,如果這一部分是回文串則把總價值加上這部分串的價值,求最大的總價值

思路:先把給出的串的總價值進行累加放入陣列中,然後對模式串給出的查詢串用manachar演算法進行計算,如果當前查詢到的ilen/2並且p[i]==len-i時,就max(ans,num[n]-num[n-p[i]+1]

),如果ansac**:

1 #include 2 #include 3 #include 4 #include 5 #include 6

using

namespace

std;

7const

int maxn=500005;8

char s[maxn],str[maxn<<1];9

int num[maxn],k[maxn<<1],p[maxn<<1

];10

int manachar(int len,int

n)11

28if(i2&&p[i]==i)

2933

else

if(i>len/2&&p[i]==len-i)

3438}39

for(int i=1; i2; i++)

40if(k[i]==k[len/2+i-1]&&k[i]!=0)41

45 printf("

%d\n

",ans);

46return0;

47}48int

main()

4967 manachar(len*2+2

,len);68}

69}70return0;

71 }

view code

4.poj--3974 palindrome

題意:給出一系列字串以「end」結束,問每個字串的最大回文串的長度

思路:manachar演算法直接算。

ac**:

1 #include 2 #include3 #include4 #include 5 #include 6

using

namespace

std;

7int p[2000005];8

char s[1000005],str[2000005];9

int manachar(int

len)

1026 maxn=max(maxn,p[i]);27}

28 printf("

%d\n

",maxn-1

);29

return0;

30}31int

main()

3246 str[len*2+2]='\0'

;47 printf("

case %d:

",t++);

48 manachar(len*2+2

);49}50

return0;

51 }

view code

排序演算法小結

1 快速排序 quicksort 快速排序是乙個就地排序,分而治之,大規模遞迴的演算法。從本質上來說,它是歸併排序的就地版本。快速排序可以由下面四步組成。1 如果不多於1個資料,直接返回。2 一般選擇序列最左邊的值作為支點資料。3 將序列分成2部分,一部分都大於支點資料,另外一部分都小於支點資料。4...

KMP演算法小結

posted on 2011 06 14 byhuangchao 主要看了這裡,感覺講的十分的不錯,總結一下。首先宣告要搜尋的串為s,設長度為n,要匹配的串為m,設長度為m.先考慮暴力的演算法,暴力的演算法是遍歷s的每乙個字元,然後從這個字元開始和m串進行匹配。時間複雜度為o nm 怎麼在此基礎上進...

排序演算法小結

1 歸併排序 3.區別與聯絡 遞迴是從未知推到已知,相當於把未知的東西壓入棧,等到可以算出結果了,就一步一步出棧。迭代是從已知到未知,從已知的東西一步一步推至目標。遞迴與迭代就好像一對逆元。遞迴的 更加清晰,但開銷更大,也更容易出錯,除錯較困難 而迭代的 編寫更困難,但速度和開銷較小。4.空間占用 ...