#ifndef BEFUN#define oopr(msg,flag) {puts(msg);return flag;}#define oor(msg) {puts(msg);return;}#define oope(msg,flag) {perror(msg);return flag;}#endifclass String...{private: char *str; int len;public: String(char *); ~String(); void operator =(String &); void operator +=(String &); bool operator ==(String &); char * subStr(int,int); int find(char,int); bool ins(char *,int); bool del(int,int); void match(char *,int *); void show(); void free(); void replace(char *); int find(char *,int *); int find(char *);};bool String::ins(char *ch,int index)...{ if(index<0 || index>len) oopr("ins err: parameter error",false); char *temp; int chlen=strlen(ch); temp=new char[len+chlen+1]; if(temp==NULL) oopr("ins err: parameter error",false); memcpy(temp,str,index); memcpy(temp+index,ch,chlen); memcpy(temp+index+chlen,str+index,len-index); chlen=len+chlen; temp[chlen]=0; free(); len=chlen; str=temp; return true;}int String::find(char c,int index)...{ for(int i=index-1;i<len;i++) if(str[i]==c) return i+1; return -1;}char * String::subStr(int index,int count)...{ if(index<1 || index>count || index>count || index+count>len+1) oopr("substr err, parameter error",NULL); char *temp=new char[count+1]; if(!temp) oopr("substr err: no enough memery",NULL); memcpy(temp,str+index-1,count); temp[count]=0; return temp;}bool String::del(int index,int count)...{ if(index<0 || index>count || index>count || index+count>len) oopr("substr err, parameter error",NULL); int chlen=len-count; char *temp=new char[chlen+1]; if(!temp) oopr("del err: no enough memery",false); memcpy(temp,str,index); memcpy(temp+index,str+index+count,len-index-count); temp[chlen]=0; free(); len=chlen; str=temp; return true;}void String::operator +=(String &s)...{ char *temp=new char[len+s.len+1]; if(temp==NULL) return; if(!strcpy(temp,str)) return; if(!strcat(temp,s.str)) return; int l=len; free(); str=temp; len=l+s.len;} void String::operator =(String &s)...{ if(s==*this) return; char *temp; temp=new char[s.len+1]; if(!temp) return; if(!strcpy(temp,s.str)) return; free(); str=temp; len=s.len;}bool String::operator ==(String & s)...{ if(len!=s.len) return false; if(strcmp(str,s.str)) return false; return true;}void String::free()...{ len=0; delete [] str; str=NULL;}String::~String()...{ free();}void String::show()...{ cout<<"len= "<<len<<" "<<str<<endl;}String::String(char *chr)...{ if(chr==NULL) return; str=new char[strlen(chr)+1]; if(str==NULL) oor("no enough memery"); len=strlen(chr); strcpy(str,chr);}void String::match(char *chr,int *pre)...{ int i,k,loc,len; len=strlen(chr); pre[0]=-1; for(i=1;i<len;i++)...{ k=i-1; while(1)...{ loc=pre[k]; if(chr[i]==chr[loc+1]) ...{pre[i]=loc+1;break;} else if(loc==-1) ...{pre[i]=-1;break;} else ...{k=loc;} } } for(i=0;i<len;i++) if(pre[i]==-1) pre[i]=0; #ifdef MATCH for(i=0;i<len;i++) cout<<i<<" "; cout<<endl; for(i=0;i<len;i++) cout<<chr[i]<<" "; cout<<endl; for(i=0;i<len;i++) cout<<pre[i]<<" "; cout<<endl;#endif}int String::find(char *chr,int *pre)...{ int chrlen,i,loc; chrlen=strlen(chr); for(i=loc=0;i<len && loc<chrlen;i++)...{ if(str[i]==chr[loc]) loc++; else ...{if(loc!=0) --i;;loc=pre[loc];} } if(loc==chrlen) return i-chrlen+1; return -1;}int String::find(char *chr)...{ int *pre,result; pre=new int[strlen(chr)]; match(chr,pre); result=find(chr,pre); return result;}void String::replace(char *chr)...{ int *pre,loc,bef,chrlen; char *tmp=str,*buf; chrlen=strlen(chr); pre=new int[chrlen]; buf=new char[len]; match(chr,pre); bef=0; while((loc=find(chr,pre))!=-1)...{ --loc; memcpy(buf+bef,str,loc); buf[bef+loc]=0; bef+=loc; str+=loc+chrlen; len-=loc+chrlen; } strcpy(buf+bef,str); len=strlen(buf)+1; str=new char[len]; strcpy(str,buf); str[len-1]=0; delete [] buf;}