用KMP,得永生

出题人威武,各种坑害~

http://acm.buaa.edu.cn/problem/225/

#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
int lena,lenb,next[1005];
void getnext(char b[])
{
    int j=0,k=-1;
    next[0]=-1;
    while(j<lenb)
    {
        if(k==-1||b[j]==b[k]||next[k]==k)   //此举旨在找寻B串中重复的东东
        {
            k++,j++;
            //如果下一个b[j]不等于b[k],那下一次next[j]要回到k的位置,这是高速回位的方法
            if(b[k]!=b[j]) next[j]=k;
            else next[j]=next[k];
        }
        else if(b[j]=='*')
        {
             //while(b[j+1]=='*') j++;
             next[j]=j;
             k=j;
             j++;
             next[j]=j-1;
             //cout<<k<<" "<<next[k]<<endl;
        }
        else k=next[k];
    }
    /*puts("yes");
    for(int i=0;i<lenb;++i)
    cout<<next[i]<<" ";
    puts("");*/
}
bool kmp(char a[],char b[])
{
    int i=0,j=0;
    lena=strlen(a);
    //cout<<lena<<endl;
    lenb=strlen(b);
    getnext(b);
    //cout<<lenb<<endl;
    while(i<lena&&j<lenb)
    {
        if(j==-1||a[i]==b[j])
        {
            i++,j++;
        }
        else if(b[j]=='*')
        {
            while(b[j+1]=='*') j++;
            if(j==lenb-1) return true;
            //puts("yes");
            if(b[j+1]==a[i])
            {
                j+=2;
            }
            i++;
            //cout<<i<<" "<<j<<endl;
        }
        else j=next[j];
    }
    while(b[j]=='*') j++;
    if(j>=lenb) return true;
    return false;
}
int main()
{
    int t;
    char a[10005];
    char b[1005];
    cin>>t;
    getchar();
    while(t--)
    {
        gets(b);
        gets(a);
        if(kmp(a,b)) puts("Yes");
        else puts("No");
    }
}

 

posted @ 2012-12-20 12:25  小仪在努力~  阅读(116)  评论(0)    收藏  举报