【Z算法】HDU_6351 Beautiful Now

一眼觉得是扩展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 }

猜你喜欢

转载自www.cnblogs.com/uuuxxllj/p/11310970.html
今日推荐