2018年全国多校算法寒假训练营练习比赛(第五场) C、字符串的问题

2018年全国多校算法寒假训练营练习比赛(第五场) C、字符串的问题

*一道KMP模板题,问字符串S中是否存在一个子串T既是S的前缀、且为后缀,而且中间也存在(不为前后缀);

*用num[i]来记录全部以S[0]为开头的子串的最长前后缀的长度出现的次数,如果num[Next[len]]=2,就意味着子串Next[len](0到Next[len]-1)在中间也出现过;如果num[Next[len]]=1,则满足题目的子串长度ans=Next[Next[len]];

#include 
#include 
#include 
#define Size 1001000
#define llt long long
using namespace std;

char s[Size];
int Next[Size];
int num[Size];
void getNext(int len){
    memset(num,0,sizeof(num));
    Next[0]=-1;
    Next[1]=0;

    for(int i=2;i<=len;++i){
        int j=Next[i-1];
        while(j!=-1){
            if(s[j]==s[i-1])break;
            j=Next[j];
        }
        Next[i]=j+1;
        ++num[Next[i]];
    }
}

int main(){
    scanf("%s",s);
    int len=strlen(s);
    getNext(len);

    int ans;
    ans=(num[Next[len]]>1||Next[len]==0)?Next[len]:Next[Next[len]];
    if(ans){
        for(int i=0;i

你可能感兴趣的:(技巧的暴力)