HDU 6740 MUV LUV EXTRA(kmp原理)

http://acm.hdu.edu.cn/showproblem.php?pid=6740

从后往前维护fail数组,枚举已出现的循环节总长度更新答案即可。

 

 1 #define bug(x) cout<<#x<<" is "<<x<<endl
 2 #define IO std::ios::sync_with_stdio(0)
 3 #define ull unsigned long long
 4 #include <bits/stdc++.h>
 5 #define iter ::iterator
 6 #define pa pair<int,ll>
 7 #define pp pair<int,pa>
 8 using namespace  std;
 9 #define ll long long
10 #define mk make_pair
11 #define pb push_back
12 #define se second
13 #define fi first
14 #define ls o<<1
15 #define rs o<<1|1
16 const int N=1e7+5;
17 ll mod=998244353;
18 ll a,b;
19 char s[N],t[N];
20 int fail[N];
21 void kmp(){
22     int n=strlen(t);
23     fail[0]=-1;
24     fail[1]=0;
25     int i=1,j=0;
26     while(i<n&&j<n){
27         if(j==-1||t[i]==t[j])fail[++i]=++j;
28         else j=fail[j];
29     }
30 }
31 int main(){
32     while(~scanf("%lld%lld%s",&a,&b,s)){
33         int n=strlen(s);
34         int m=0;
35         for(int i=n-1;i>0;i--){
36             if(s[i]=='.')break;
37             t[m++]=s[i];
38         }
39         kmp();
40         ll ans=a-b;
41         for(int i=2;i<=m;i++){
42             ans=max(ans,a*i-b*(i-fail[i]));
43         }
44         printf("%lld\n",ans);
45     }
46 }

 

posted @ 2019-09-29 13:45  Venux  阅读(496)  评论(0编辑  收藏  举报