找到第一个合法的去更新,如果这样是需要一直跳的
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,f[N],ne[N];
char s[N];
signed main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int T;
cin>>T;
while(T--){
cin>>n>>(s+1);
ne[1]=0;
for(int i=2,j=0;i<=n;i++){
while(j&&s[i]!=s[j+1])j=ne[j];
if(s[i]==s[j+1])j++;
ne[i]=j;
}
// memset(f,0x3f,sizeof f);
for(int i=1;i<=n;i++)f[i]=1e9;
f[0]=0;
for(int i=1;i<=n;i++){
f[i]=f[i-1]+1;
int j=i;
while(ne[j]*2>i)j=ne[j];
f[i]=min(f[i],f[i-ne[j]]+1);
}
cout<<f[n]<<'\n';
}
}