BZOJ 3620: 似乎在梦中见过的样子
一道水题调了这么久,还半天想不出来怎么 T 的…佩服自己(果然蒟蒻)
这题想想 KMP 但是半天没思路瞟了一眼题解发现暴力枚举起始点,然后 KMP
O( n2 )能过啊!!! (╯‵□′)╯︵┻━┻
代码如下:
1 //by Judge 2 #include<cstring> 3 #include<cstdio> 4 using namespace std; 5 const int M=2e4+111; 6 int n,k,res; 7 int nxt[M]; char s[M]; 8 int main(){ 9 scanf("%s%d",s+1,&k),n=strlen(s+1); 10 for(int t=1,i,j;t<=n-(k<<1);++t){ 11 for(i=1;i<=t;++i) nxt[i]=t-1; //这里不加等着 T 飞吧 12 for(i=t+1,j=t-1;i<=n;++i){ 13 while(j^t-1 && s[i]!=s[j+1]) j=nxt[j]; 14 if(s[i]==s[j+1]) ++j; nxt[i]=j; 15 } //nxt 数组是要先预处理的,然后才能处理答案 16 for(i=t+1,j=t-1;i<=n;++i){ 17 while(j^t-1 && s[i]!=s[j+1]) j=nxt[j]; 18 if(s[i]==s[j+1]) ++j; 19 while(j-t+1>=i-j) j=nxt[j]; //题目中的 B 没了,跳向 nxt 20 if(j-t+1>=k) ++res; //长度满足就累加答案 21 } 22 } printf("%d\n",res); return 0; 23 }
讲讲怎么,啊不,是为什么会 T 飞 。 看 RP ….
emmmm 其实。。。我一开始觉得nxt 数组是没问题的,每次都会更新,不用初始化啊。然后…智障的发现 i 的 nxt 指针是上次循环剩下来的…FAQ 于是愉快 T 飞