(https://www.luogu.org/problemnew/show/P4391)
题目描述
给你一个字符串,它是由某个字符串不断自我连接形成的。 但是这个字符串是不确定的,现在只想知道它的最短长度是多少.
输入输出格式
输入格式:
第一行给出字符串的长度,1 < L ≤ 1,000,000.
第二行给出一个字符串,全由小写字母组成.
输出格式:
输出最短的长度
输入输出样例
输入样例#1: 复制8 cabcabca输出样例#1: 复制
3
说明
对于样例,我们可以利用"abc"不断自我连接得到"abcabcabc",读入的cabcabca,是它的子串
#include <iostream> using namespace std; const int maxn = 1e6+10; char a[maxn]; int ne[maxn]; int main() { ios::sync_with_stdio(false); cin.tie(0); int n; cin >> n; cin >> a+1; for(int i=2,j=0;i<=n;i++) { while(j&&a[i]!=a[j+1]) j=ne[j]; if(a[i]==a[j+1]) j++; ne[i]=j; } cout << n-ne[n] << endl; return 0; }