HDU_3746_Cyclic Nacklace

/*

求形成循环节需要增加颜色珠子。

*/

#include<iostream>

#include<cstring>

#include<string>

#include<cmath>

#include<cstdio>

#include<algorithm>

#include<vector>

using namespace std;

int lena,lenb,Max;

int nt[100005];

void getnt(string b)

{

    int j=0,k=-1;

    nt[0]=-1;

    while(j<lenb)

    {

        if(k==-1||b[j]==b[k])   //此举旨在找寻B串中重复的东东

        {

            k++,j++;

            //如果下一个b[j]不等于b[k],那下一次nt[j]要回到k的位置,这是高速回位的方法

            nt[j]=k;

        }

        else k=nt[k];

    }

    if(k!=0) Max=nt[lenb-1]+1;

}

int main()

{

    string a,b;

    while(getline(cin,b,'\n'))

    {

        lena=b.length();

        getline(cin,a,'\n');

        lena=lena>a.length()?a.length():lena;

        b+=a;

        Max=0;

        lenb=b.length();

        getnt(b);

        if(Max==0)

        cout<<Max<<endl;

        else

        {

            if(Max>lena) Max=lena;

            b=b.substr(0,Max);

            cout<<b<<" "<<Max<<endl;

        }

    }

}

 

你可能感兴趣的:(HDU)