生活随笔
收集整理的這篇文章主要介紹了
Codeforce-126B:Password(KMP模板题)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接:點擊打開鏈接
題目大意:
給你一個串,讓你求這個串的一個同時是前綴,后綴(這個說法好像不太對)且在串中出現過的最長子串。
舉個例子:
對于串 fixprefixsdfix 就應該輸出fix.
解題思路:
首先這個串同時是前綴和后綴,那么自然就想到了kmp算法中的next數組。因為next數組的值正好符合題目最長要求。但是同時要求這個串在整個串中間出現過,那就暴力枚舉一發即可,將所有可能的長度都枚舉一遍,這時候我們就發現,你每次枚舉的長度其實是用next數組在跳躍的,具體還是要理解清楚next數組的性質。
其次要說明一點就是,這個串可以部分與前綴和后綴重合但不能完全重合(這不廢話嘛),例如 papapapap 答案是 papap 。就在kmp模板里稍微改一下即可。
以下貼代碼,
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <queue>
#include <map>
#include <algorithm>
#include <stack>
#include <set>
#include <functional>
#define rank ra
#define next ne
#define pb push_back
#define hash haha
#define lson rt<<1
#define rson rt<<1|1
#define xlson xl,xmid,xt<<1
#define xrson xmid+1,xr,xt<<1|1
#define ylson yl,ymid,xt,yt<<1
#define yrson ymid+1,yr,xt,yt<<1|1
using namespace std;
typedef long long ll;
char a[1000005];
char t[1000005];
int next[1000005];
int ans,n;
void get_next(char a[])
{int l=strlen(a);int i=0;int j=-1;next[0]=-1;while(i<l){if(j==-1||a[i]==a[j]){i++;j++;next[i]=j;}elsej=next[j];}
}
int kmp(char s[],char t[]) //kmp模板
{int ls=strlen(s);int lt=strlen(t);int j=0;int i=0;get_next(s);while(i<lt&&j<ls){if(j==-1||s[j]==t[i]){i++;j++;if(j==ls&&i==j) //匹配成功但是是前綴繼續匹配j=next[j];}elsej=next[j];}if(j==ls&&i!=lt) //匹配成功且不是后綴return 1;return 0;
}
int main()
{while(scanf(" %s",a)!=EOF){get_next(a);int l=strlen(a);int k=next[l];ans=0;for(int i=k;i>=0;i=next[i]) //枚舉所有可能長度{for(int j=0;j<i;j++)t[j]=a[j];t[i]='\0';if(kmp(t,a)){ans=i;break;}}if(ans==0)printf("Just a legend\n");else{for(int i=0;i<ans;i++)printf("%c",a[i]);printf("\n");}}
}
總結
以上是生活随笔為你收集整理的Codeforce-126B:Password(KMP模板题)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。