用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"); } }
浙公网安备 33010602011771号