[vijos 1677] 陶陶的名字(kmp) 标签: kmpvijos 2017-05-13 09:36 67人阅读 评论(0)

背景

陶陶是一个智能机器人,他能像人一样思考问题,不过由于IQ问题,他给自己取了一个很长很长的名字。
描述

某一天,陶陶想把自己的名字涂在墙上。由于他的名字太长,为了省事,他从自己名字的开头截取了一段作为模板。我们不妨设这个模板的长度为l,陶陶的名字的长度为L,那么有1≤l≤L。然后陶陶会用这个模板进行若干次喷涂,喷出自己的名字(后一次喷涂会覆盖前一次喷涂的结果,例如当前墙上已经有abc三个字符,那么如果在c处进行喷涂,就会得到ababc)。陶陶喷涂名字总是从前向后喷的,假设陶陶喷涂了k次,这k次喷涂按时间顺序第i次喷涂的位置是s[i],那么s[i]

#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<iostream>
using namespace std;
char t[1000100];
int len;
int Next[1000100];
int ans[1000100];
void makeNext(){
    Next[1]=0;
    int i=1,j=0;
    while(i<=len){
        if(j==0||t[i]==t[j]){
            i++;j++;
            Next[i]=j;
        }
        else j=Next[j];
    }
}
int main(){
    //freopen("in.txt","r",stdin);
    scanf("%s",t+1);
        len=strlen(t+1);
        makeNext();
        int k;
        for(int i=len+1;i>=1;i--)
            if(Next[i]==1){//从后往前 找到next[i]==1的情况
                k=i-1;
                break;  
            }
        int ans=len;//判断超出的情况
        while(Next[ans+1]-1>=k) ans=Next[ans+1]-1;
        printf("%d",ans);
    return 0;
}
原文地址:https://www.cnblogs.com/xljxlj/p/7183665.html