思路:AC自动机把所有可能的后缀处理出来(最多有100个不同后缀),然后dp,F[i][u]表示i个字符后缀为AC自动机里的第u个后缀,最多匹配次数。
max(f[m][i],i=0..100)即答案,这样可以拿到【60分】,因为m可以非常大。
但是我们可以容易证明:当m趋于无限大时,最优情况下,一定出现重复串,而且是重复串连续放在一起。
这里,我们假设当m=1000时,一定会产生重复串,把字符序列输出,找出起重复串(并记录这串的匹配数量),然后从m中减去重复串,最后m留下不超过1000的。
然后都是瞎搞【90分】 还有10分不知道为什么错,也许1000取太小?
#include<stdio.h>
#include<vector>
#include<queue>
#include<string.h>
#include<iostream>
using namespace std;
#define ACMXNODE 110 //AC自动机节点数(最大为所有字符串字符个数和)
int charIdx(char ch){ return ch-'a'; }
#define CHARSIZE 30 //不同字符个数(128可以处理大部分情况,空间紧张可以减少这个值,但要保证c