題意:亂七八糟說了一大堆,就是先給你乙個長度26的字串,對應了abcd....xyz,這是乙個密碼表。然後給你乙個字串,這個字串是不完整的(完整的應該是前半部分是加密的,後半部分是解密了的),然而,給你的字串一定是加密的部分+一部分解密的部分(可以是全部,也可以是沒有),讓你求出最短的完整字串;
解題思路:考慮給出的字串加密部分一定全部給出,所以,給出的字串的一半一定是加密的,所以把這一半先轉換好,然後和字尾比一下,求最長的公共字首,用kmp和拓展kmp都行;
拓展kmp(這裡要注意下,如果用這個,那麼一定公共字首一定要等於字尾,也就是next[i]+i>len)
#include#include#include#include#include#define maxn 100500using namespace std;
char t[maxn];
char word[maxn];
char ans[maxn];
char s[maxn];
int _next[maxn];
int tlen;
void get_next()
int len=strlen(t);
for(int i=0;i=tlen)
maxx=max(maxx,_next[i]);
}//cout#include#include#include#include#include#define maxn 100500
using namespace std;
char t[maxn];
char ans[maxn];
char word[maxn];
char s[maxn];
int next1[maxn];
int tlen;
void get_next()
int len=strlen(t);
for(int i=0;itlen/2)
maxx=tlen/2;
int slen=tlen-maxx;
for(int i=0;icout
}
HDU 1711 裸KMP,附KMP模板
pattern為模板串,從0下標,長度為len。返回next陣列 templatevoid kmp pre t pattern,int len,int next text為匹配串,lent為其長度。pattern為模板串,lenp為其長度,next為上面得到的next陣列。返回乙個vector,表示...
hdu4333 擴充套件kmp
題意 給定乙個數字 10 100000,一次將該數的第一位放到放到最後一位,求所有組成的不同的數比原數小的個數,相等的個數,大的個數 分析 由於輸入的數太大了,只能當作字串處理,將輸入的原串貼上在後面,這樣就可以對原串進行ekmp,最終只要統計從第i個位置開始的extend i 如果 len則從第i...
hdu4763 擴充套件kmp
題意是在乙個字串中找出乙個字首乙個字尾和乙個中間的子串,互相不重疊並且三部分完全一樣 運用的是exkmp 對自身求乙個next陣列 next i 表示以i為開始位置的子串與整個串的字首最長匹配到多少長度 然後就是列舉了 注意到我們列舉後三分一的位置時,如果某個位置為i,且next i i len。也...