第一次用KMP模式匹配!!!
Problem : 1039 ( Easier Done Than Said? ) Judge Status : Accepted
RunId : 16336538 Language : G++ Author : qwezhaohaihong
Code Render Status : Rendered By HDOJ G++ Code Render Version 0.01 Beta
Problem : 1039 ( Easier Done Than Said? ) Judge Status : Accepted
RunId : 16336538 Language : G++ Author : qwezhaohaihong
Code Render Status : Rendered By HDOJ G++ Code Render Version 0.01 Beta
#include<iostream> #include<cstdio> #include<string.h> using namespace std; int KMP(const char Text[],const char Pattern[]); void getnext(const char pattern,int next[]); int main() { char s[100000],q[4]={"end"}; while(scanf("%s",s)!=EOF) { if(KMP(s,q)>=0){break;} getchar(); int i,len=strlen(s); bool k=false; for(i=0;i<=len-1;i++) { if(s[i]=='a'||s[i]=='e'||s[i]=='i'||s[i]=='o'||s[i]=='u') { k=true;break; } } if(!k) {printf("<%s> is not acceptable.\n",s);continue;} int sum=1;//判断三个练续的元音或辅音 bool kk; if(s[0]=='a'||s[0]=='e'||s[0]=='i'||s[0]=='o'||s[0]=='u'){kk=true;} else{kk=false;} k=true; for(i=1;i<=len-1;i++) { if(s[i]=='a'||s[i]=='e'||s[i]=='i'||s[i]=='o'||s[i]=='u') { if(kk) {sum++;kk=true;} else{sum=0;sum++;kk=true;} } else { if(kk) { sum=0; sum++; kk=false; } else{sum++;kk=false;} } if(sum==3) { k=false; break; } } if(!k){printf("<%s> is not acceptable.\n",s);continue;} char pdd[3]={"aa"}; while(pdd[0]<='z') { if(pdd[0]=='e'||pdd[0]=='o') { pdd[0]=pdd[0]+1; pdd[1]=pdd[1]+1; } else { int r; r=KMP(s,pdd); if(r==-1){k=true;} else{k=false;break;} pdd[0]=pdd[0]+1; pdd[1]=pdd[1]+1; } } if(k) { printf("<%s> is acceptable.\n",s); } else{printf("<%s> is not acceptable.\n",s);} } return 0; } void getnext(const char pattern[],int next[]) { next[0]=-1; int k=-1,j=0; while(pattern[j]!='\0') { if(k!=-1&&pattern[k]!=pattern[k]) { k=next[k]; } ++k;++j; if(pattern[k]==pattern[j]) { next[j]=next[k]; } else{next[j]=k;} } return ; } int KMP(const char Text[],const char Pattern[]) //const 表示函数内部不会改变这个参数的值。 { if( !Text||!Pattern|| Pattern[0]=='\0' || Text[0]=='\0' )// return -1;//空指针或空串,返回-1。 int len=0; /*const char * c=Pattern; while(*c++!='/0')//移动指针比移动下标快。 { ++len;//字符串长度。 }*/ len=strlen(Pattern); int *next=new int[len+1];//动态开辟内存; getnext(Pattern,next);//求Pattern的next函数值 int index=0,i=0,j=0; while(Text[i]!='\0' && Pattern[j]!='\0' ) { if(Text[i]== Pattern[j]) { ++i;// 继续比较后继字符 ++j; } else { index += j-next[j]; if(next[j]!=-1) j=next[j];// 模式串向右移动 else { j=0; ++i; } } }//while delete []next; if(Pattern[j]=='\0') return index;// 匹配成功 else return -1; }