HDU-1039
2016-02-21 19:00
232 查看
第一次用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; }
相关文章推荐
- iOS基础之单例传值
- 淘宝应对"双11"的技术架构分析
- 职坐标 选课系统整体框架 参考
- 算法精讲学习笔记 字符串
- 数组(二维数组)
- 自定义控件分析1
- Eclipse相关问题
- mysql - 汇总函数
- SWIFT 闭包的简单使用
- webStorm:正确的代码也提示绿色下划线的解决方法
- Leetcode 258
- 九大排序算法再总结
- sort c++ double
- CGI/FastCGI学习-篇一
- xcode怎么把自定义代码添加到代码库CodeSnippets
- Android中ListView适配器里区分不同按钮的点击事件
- os_time.c
- Android Wear 进阶 2.1 Creating and Running a Wearable App 创建和运行手表应用
- java安全 ——JAAS(Java 认证和授权服务)开发指南
- 拷贝构造函数与析构顺序