hdu 3613 擴充套件kmp 回文串

2022-06-02 14:33:10 字數 1577 閱讀 5835

題目大意:

給個字串s,要把s分成兩段t1,t2,每個字母都有乙個對應的價值,如果t1,t2是回文串(從左往右或者從右往左讀,都一樣),那麼他們就會有乙個價值,這個價值是這個串的所有字母價值之和,如果不是回文串,那麼這串價值就為0。問最多能獲得多少價值?

對於我們只需要列舉掃瞄一遍extend陣列,掃瞄到的當前位置之前為前半部分t1,

然後用根據extend陣列可以判斷t1是否是回文。那後半部分t2呢?  剛才是用s去匹配t,

如果要求字尾,只需要用t去匹配s,再得到乙個陣列extend2即可,根據這個extend2判斷後半部分t2是否是回文。

1 #include2 #include3 #include4 #include5 #include6 #include7 #include8

using

namespace

std;

9#define mod 1000000007

10const

int inf=0x3f3f3f3f;11

const

double eps=1e-5;12

#define cl(a) memset(a,0,sizeof(a))

13#define ts printf("*****\n");

14const

int maxn=500005;15

intn,m,tt;

16char

s1[maxn],s2[maxn];

17int v[29

],sum[maxn];

18void pre_ekmp(char x,int m,int

nextt)

1937}38

}39void ekmp(char x,int m,char y,int n,int nextt,int

extend)

4058}59

}60intnextt[maxn],extend1[maxn],extend2[maxn];

61int

main()

6274 scanf("%s"

,s1);

75int len=strlen(s1);

76for(i=0;i)

7780

strcpy(s2,s1);

81strrev(s2);

82ekmp(s2,len,s1,len,nextt,extend1);

83ekmp(s1,len,s2,len,nextt,extend2);

84int maxx=0;85

for(i=1;i//

列舉斷點

8692

int ll=len-i;

93if(ll+extend2[ll]==len)

9497 maxx=max(maxx,tot);98}

99 printf("

%d\n

",maxx);

100}

101 }

hdu4333 擴充套件kmp

題意 給定乙個數字 10 100000,一次將該數的第一位放到放到最後一位,求所有組成的不同的數比原數小的個數,相等的個數,大的個數 分析 由於輸入的數太大了,只能當作字串處理,將輸入的原串貼上在後面,這樣就可以對原串進行ekmp,最終只要統計從第i個位置開始的extend i 如果 len則從第i...

hdu4763 擴充套件kmp

題意是在乙個字串中找出乙個字首乙個字尾和乙個中間的子串,互相不重疊並且三部分完全一樣 運用的是exkmp 對自身求乙個next陣列 next i 表示以i為開始位置的子串與整個串的字首最長匹配到多少長度 然後就是列舉了 注意到我們列舉後三分一的位置時,如果某個位置為i,且next i i len。也...

hdu 6153 擴充套件kmp

題意 給定兩個字元s1,length len1 s2 length len2 求s2 i len i 1,2,3,4,len 在s1中出現的次數乘上其長度 例如 s1 abababc,s2 abc,則應求abc,bc,c,在s1中出現的次 數。然而擴充套件kmp是求字首的,所以想到將s1,s2反轉一...