BZOJ 3620: 似乎在梦中见过的样子

时间:2025-02-01 17:37:32

似乎在梦中见过的样子....

一道水题调了这么久,还半天想不出来怎么 T 的...佩服自己(果然蒟蒻)

这题想想 KMP 但是半天没思路瞟了一眼题解发现暴力枚举起始点,然后 KMP

如图:

BZOJ 3620: 似乎在梦中见过的样子

O( n)能过啊!!!    (╯‵□′)╯︵┻━┻

代码如下:

 //by Judge
#include<cstring>
#include<cstdio>
using namespace std;
const int M=2e4+111;
int n,k,res;
int nxt[M]; char s[M];
int main(){
scanf("%s%d",s+1,&k),n=strlen(s+1);
for(int t=1,i,j;t<=n-(k<<1);++t){
for(i=1;i<=t;++i) nxt[i]=t-1; //这里不加等着 T 飞吧
for(i=t+1,j=t-1;i<=n;++i){
while(j^t-1 && s[i]!=s[j+1]) j=nxt[j];
if(s[i]==s[j+1]) ++j; nxt[i]=j;
} //nxt 数组是要先预处理的,然后才能处理答案
for(i=t+1,j=t-1;i<=n;++i){
while(j^t-1 && s[i]!=s[j+1]) j=nxt[j];
if(s[i]==s[j+1]) ++j;
while(j-t+1>=i-j) j=nxt[j]; //题目中的 B 没了,跳向 nxt
if(j-t+1>=k) ++res; //长度满足就累加答案
}
} printf("%d\n",res); return 0;
}

讲讲怎么,啊不,是为什么会 T  飞 。 看 RP ....

emmmm 其实。。。我一开始觉得nxt 数组是没问题的,每次都会更新,不用初始化啊。然后...智障的发现 nxt   指针是上次循环剩下来的...FAQ  于是愉快 T 飞