一眼觉得是扩展KMP
不过套了个短小的Z算法
1 #include <bits/stdc++.h> 2 #define For(i,a,b) for(int i=a;i<=b;++i) 3 #define Dec(i,b,a) for(int i=b;i>=a;--i) 4 #define file() freopen("c://users/asus/desktop/v.txt","r",stdin); 5 #define IO ios::sync_with_stdio(0),cin.tie(0) 6 #define inf 0x3f3f3f3f 7 using namespace std; 8 typedef long long ll; 9 10 int n,kase,z[2000010]; 11 string s,b; 12 int main() 13 { 14 IO; 15 // file(); 16 cin>>kase; 17 while(kase--) 18 { 19 cin>>s; b=s; 20 s=s+'#'+b; 21 for(int i=1,mx=0,l=0;i<s.size();++i) 22 { 23 z[i]=i<mx?min(mx-i,z[i-l]):0; 24 while(s[z[i]]==s[i+z[i]]) z[i]++; 25 if(i+z[i]>mx) mx=i+z[i],l=i; 26 } 27 ll ans = 0; 28 for(int i=b.size()+2;i<s.size();++i) 29 { 30 int t = z[i] + (i+z[i]<s.size() ? 1 : 0); 31 ans += t; 32 } 33 cout<<ans<<"\n"; 34 } 35 }