这道题不难 前提是搞懂next数组的求的过程 加上点递归的思想
#include<stdio.h> #include<string.h> #include<iostream> using namespace std; char str[200021]; int main() { int n,i,j,T; int next[200020]; scanf("%d",&T); while(T--) { scanf("%d",&n); scanf("%s",str); str[n]=‘@‘; n++; memset(next,0,sizeof(next)); next[0]=-1; int sum=0,j=0,k=-1; while(j<n) { if(k==-1||str[j]==str[k]) { ++k; ++j; next[j]=k; } else k=next[k]; } sum=0; for(i=1;i<n;i++) { sum++; int k=i; while(next[k]) { sum++; sum%=10007; k=next[k]; } } printf("%d\n",sum); } return 0; }
时间: 2024-10-21 23:23:32