hdu 3336 next数组统计前缀次数
前缀次数总和=前缀种类数+每种前缀在后面的出现次数
贴一个不错的题解,但是题解有个地方讲的不是太清晰,就是为什么next【j】+1==next【j+1】的时候就不统计了呢?
http://972169909-qq-com.iteye.com/blog/1114968
因为如果next等于后一个next值加一的话,这次的统计会在后面也被统计到,所以忽略
#include<stdio.h> #include<string.h> #define val 200005 int next[val],lenp; char p[val]; void set_next(); int main() { int cas,i,ans; for(scanf("%d",&cas);cas;cas--) { scanf("%d",&lenp); scanf("%s",p); set_next(); ans=lenp+next[lenp]; for(i=lenp-1;i>=1;i--) if(next[i]!=next[i+1]-1) ans+=next[i]; printf("%d\n",ans%10007); } return 0; } void set_next() { int k,j; k=-1,j=0; next[j]=k; while(j<lenp) { if(k==-1||p[j]==p[k]) { k++; j++; next[j]=k; } else k=next[k]; } }