ACwing_4188. 连接字符串_KMP

ACwing_4188. 连接字符串_KMP

给你一个字符串,它是由某个字符串不断自我连接形成的。

但是这个字符串是不确定的,现在只想知道它的最短长度是多少。

输入格式

第一行给出字符串的长度 LL,第二行给出一个字符串,全由小写字母组成。

输出格式

输出最短的长度。

数据范围

1≤L≤1061≤L≤106

输入样例:

8
cabcabca

输出样例:

3

样例解释

对于样例,我们可以利用 abc 不断自我连接得到 abcabcabc,读入的 cabcabca 是它的子串。

//
#include<bits/stdc++.h>
using namespace std;

const int N=1e6+7;
int abfix[N];

void init( const string &p )
{
    int i,j;
    abfix[0]=abfix[1]=0;
    for( i=1;i<p.size();i++ )
    {
        j=abfix[i];
        while( j && p[j]!=p[i] ) j=abfix[j];
        if( p[j]==p[i] )    abfix[i+1]=j+1;
        else                abfix[i+1]=0;
    }
}

int main()
{
    string p;
    int n;
    
    while( cin>>n>>p )
    {
        init(p);
        cout<<n-abfix[n]<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_63173957/article/details/125286480