听说数据水把暴力放过去了……还是写一写题解吧。
与CF126B一模一样的题。
KMP算法中,求了一个前缀函数: 为前
个字符组成的子串中、真前缀、真后缀相等的最大长度。
例如对于abcabcd
a,,没有真前后缀。
ab,abc,abca,abcab,abcabc,abcabcd,
那么对于给出的字符串求 数组后,前后缀相等的最大长度即为
。
并且只要途中出现过 ,就说明途中出现了一次与前后缀相同的字符串。
除此之外的一个坑点: 可能大于所有
,因此出现此种情况时缩短所取前后缀的长度:
,直到存在
。
如果缩短后 ,说明无解。
当然题目保证了有解了。
不懂前缀函数的可以去OI-Wiki看看。
#include <cstdio>
#include <cstring>
const int maxn = 1e5 + 100;
char s[maxn];
int maxx,len,pi[maxn];
int main()
{
scanf("%s",s + 1);
len = strlen(s + 1);
for(int i = 2,k = 0;i<=len;++i)
{
while(k && s[i] != s[k + 1]) k = pi[k];
if(s[i] == s[k + 1]) ++k;
pi[i] = k;
if(i != len && maxx < k) maxx = k;
}
while(pi[len] > maxx) pi[len] = pi[pi[len]];
for(int i = 2;i<len;++i) if(pi[i] == pi[len])
{
for(int j = i - pi[i] + 1;j<=i;++j) putchar(s[j]);
return 0;
}
return 0;
} 
京公网安备 11010502036488号