这是一道比较在一串字符串中是否存在形如EAEBE;
input :
5 xy abc aaa aaaaba aaxoaaaaaoutput
0 0 1 1 2代码:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int Max=1e6+10;
int nex[Max];
char str[Max];
int len;
void Get();
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
scanf("%s",str+1);
len=strlen(str+1);
Get();
int m=len;
while(m)
{
if(nex[m]*3<=len)
break;
else
m=nex[m];
}
if(m==0||len<3)//m==0:指在串中并没有找到中间字符串有“E”的情况,len<3:根本就不符合组成EAEBE
{
printf("0\n");
continue ;
}
m=nex[m];//存在则输出对应的长度
printf("%d\n",m);
}
}
void Get()
{
memset(nex,0,sizeof nex);
int j;
nex[1]=j=0;
for(int i=2;i<=len;i++)
{
while(j&&str[i]!=str[j+1]) j=nex[j];
if(str[j+1]==str[i]) j++;
nex[i]=j;
}
}