听说数据水把暴力放过去了……还是写一写题解吧。
与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; }