总算是给了字符串总长度,这样就不用担忧超时了。
AC代码如下:
ybt
POJ
LOJ
AC代码:
#include <cstdio>
#include <cstring>
#define maxn 400010
#define B 257
#define ULL unsigned long long
using namespace std;
char a[maxn];
ULL ah[maxn],n[maxn];
int b[maxn],bn,an;
int main(){
int i,len;
while(scanf("%s",a+1)!=EOF){//没有明确说明输入何时结束的处理手法
an=strlen(a+1);
n[0]=1;
for(i=1;i<=an;i++)n[i]=n[i-1]*B;//B进制
ah[0]=0;
for(i=1;i<=an;i++)ah[i]=ah[i-1]*B+a[i];//哈希值计算
bn=0;
for(len=1;len<=an;len++)
if(ah[len]==ah[an]-ah[an-len]*n[len])b[++bn]=len;
printf("%d",b[1]);
for(i=2;i<=bn;i++)printf(" %d",b[i]);
printf("\n");
}
return 0;
}
刷到此题时,感觉进入了吃草的状态,重复啊,重复。