題目大意:
給個字串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 #include8using
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反轉一...