1. 程式人生 > >親和串 HDU - 2203 (KMP 迴圈移位一個串去匹配)

親和串 HDU - 2203 (KMP 迴圈移位一個串去匹配)

題意:

 判斷P串是不是能和T串迴圈移位K位後的字串有匹配點

分析:
 把T往自身後面貼一下變成TT,然後看P在TT中有沒有匹配點即可~~~

這種往後帖一下的思想可以說是一種技巧,比如:求陣列挖去連續一塊後求剩下的有多少個不同的數.

#include<bits/stdc++.h>

using namespace std;

const int maxn = 100000+111;
char s[maxn+maxn],p[maxn];
int n,m,f[maxn];

void getfail()
{
    f[0]=f[1]=0;
    for(int i=1;i<m;i++)
    {
        int j=f[i];
        while(j && p[j]!=p[i])j=f[j];
        f[i+1]=p[i]==p[j]?j+1:0;
    }
}
bool kmp()
{
    if(n<m)return false;
    int j=0;
    for(int i=0;i<n+n;i++)
    {
        while(j && s[i]!=p[j])j=f[j];
        if(s[i]==p[j])j++;
        if(j==m)return true;
    }
    return false;
}


int main()
{
    while(scanf("%s%s",s,p)!=EOF)
    {
        n=strlen(s);
        m=strlen(p);
        for(int i=n;i<2*n;i++)
        {
            s[i]=s[i-n];
        }
        s[2*n]=0;
        if(kmp())puts("yes");
        else puts("no");
    }
}