SP705都过了,这道题死活调不出来……
#include<bits/stdc++.h>
using namespace std;
const int N=4005;
int turn(char c){
if(c>='A'&&c<='Z')return c-'A'+1;
return c-'a'+27;
}
int ch[N][60],fa[N],len[N],tot;
int las;
void addp(int c){
int p=las,np=las=++tot;
len[np]=len[p]+1;
for(;p&&!ch[p][c];p=fa[p])ch[p][c]=np;
if(!p)fa[np]=1;
else{
int q=ch[p][c];
if(len[q]==len[p]+1)fa[np]=q;
else{
int nq=++tot;
for(int i=1;i<=52;i++)
ch[nq][i]=ch[q][i];
fa[nq]=fa[q];
len[nq]=len[p]+1;
fa[q]=fa[np]=nq;
for(;p&&ch[p][c]==q;p=fa[p])ch[p][c]=nq;
}
}
}
int dp[N];
void dfs(int now){
if(dp[now])return;
dp[now]=1;
for(int i=1;i<=52;i++)
if(ch[now][i])
dfs(ch[now][i]),dp[now]+=dp[ch[now][i]];
}
string s;
int main(){
int t;
cin>>t;
while(t--){
memset(ch,0,sizeof(ch));
memset(dp,0,sizeof(dp));
tot=las=1;
cin>>s;
for(int i=0;i<s.size();i++)
addp(turn(s[i]));
dfs(1);
cout<<dp[1]-1<<"\n";
}
return 0;
}