您的位置:首页 > 其它

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


#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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: