题意:从一个小数的小数部分,计算下面式子的最大值
其中a和b是给定的参数,p是循环结已知的长度,l是循环结的长度 例如对于abab,p是4,l就是2
思路: 贪心的来说我们要让p更大,l尽可能小,所以我们从给的小数的最后一位开始枚举,遍历的小数为作为p,那么l就是循环结的长度,对于循环结长度,我们可以用kmp求得。
#include<bits/stdc++.h>
using namespace std
;
const int N
=1e7+5;
int ne
[N
];
char s
[N
];
void getNext(){
int i
=0,j
=-1;
ne
[i
]=j
;
int len
=strlen(s
);
while(i
<len
){
if(j
==-1 || s
[i
]==s
[j
]) ne
[++i
]=++j
;
else j
=ne
[j
];
}
}
int main(){
int a
,b
;
while(~scanf("%d%d",&a
,&b
)){
scanf("%s",s
);
reverse(s
,s
+strlen(s
));
getNext();
long long ans
=-1e18;
for(int i
=0;s
[i
]!='.';i
++){
ans
=max(ans
,1ll*(i
+1)*a
-1ll*b
*(i
+1-(ne
[i
+1])));
}
cout
<<ans
<<endl
;
}
return 0;
}