背景
陶陶是一个智能机器人,他能像人一样思考问题,不过由于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;
}