亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? matchall.cpp

?? 一個值得學習的模式匹配改進的KMP算法
?? CPP
字號:
#include<iostream>
#include<string>
#include<fstream>
using namespace std;
class NoMem{};
class OutOfBounds{};

class String
{ 
public:
	String(char *s="");
	String(const String& s);
	~String();
	String& operator=(const String& s);
	bool  operator==(const String& s)const;
	int Length()const;
	String operator+(const String& s)const;
	void  operator+=(const String& s);
	int   Find(char c,int start)const;
	String  SubStr(int index,int count)const;
	void  Insert(const String& s,int index);
	void  Delete(int index, int count);
	int ReadString(istream &is=cin,char delimiter='\n');
	void  PrintString( )const;
	int  Match(String& t,int &i);
	void Prefix();
	void ModifiedPrefix();
	//private:
	char *str; 
	int  size;  
	int  *pre; //前綴函數(shù)數(shù)組
};

String::String(char *s)
{
	int n;
	n=strlen(s)+1;
	//為字符數(shù)組分配空間
	str=new char[n];
	//若空間分配失敗則拋出異常
	if (str==0)  throw NoMem();
	size=n;
	//將字符串拷貝到本對象字符數(shù)組中
	strcpy(str,s);
	//為前綴函數(shù)數(shù)組分配空間
	pre=new int[size];
	if  (pre==0)   throw  NoMem();
}

String::String(const String& s)
{
	int n;
	n=s.size;
	//為本對象的字符數(shù)組分配空間
	str=new char[n];
	if (str==0)  throw NoMem();
	size=n;
	//將對象s的字符數(shù)組拷貝到本對象的字符數(shù)組中
	strcpy(str,s.str);
	//為前綴函數(shù)數(shù)組分配空間
	pre=new int[size];
	if  (pre==0)  throw  NoMem();
}


String::~String()
{ 
	//釋放本對象字符數(shù)組所占用空間 
	delete  []str; 
	delete []pre;
}

String&  String::operator=(const String& s)
{
	//若本對象字符數(shù)組空間不等于s的字符數(shù)組空間
	if (size!=s.size)
	{
		//刪除本對象字符數(shù)組空間
		delete []str;
		//為本對象分配一塊與s的字符數(shù)組同等大小的空間
		str=new char[s.size];
		if (str==0)  throw  NoMem();
		size=s.size;
	}
	//將s的字符數(shù)組拷貝到本對象的字符數(shù)組中
	strcpy(str,s.str);
	//返回賦值后的本類對象
	return *this;
}

bool String::operator==(const String& s)const
{
	return strcmp(str,s.str)==0;
}

int String::Length( )const
{
	return size-1;
}

String String::operator+(const String& s) const
{
	//創(chuàng)建新串對象temp 
	String  temp;
	//釋放temp的空串所占用空間
	delete  []temp.str;
	//為temp的字符數(shù)組分配空間,以存放連接后的串
	int  n=size+s.size-1;
	temp.str=new char[n];
	if (temp.str==0)    throw  NoMem( );
	temp.size=n;
	//將本對象存放的串拷貝到temp中
	strcpy(temp.str,str);
	//將s中的串連接至temp的串后
	strcat(temp.str,s.str);
	//返回串對象temp
	return  temp;
}

void String::operator+=(const String& s)
{ char *temp;
//為存放連接后的串的字符數(shù)組temp分配空間
temp=new char[size+s.size-1];
if (temp==0)  throw NoMem();
//將本對象存放的串拷貝到temp中
strcpy(temp,str);
//將s中存放的串連接至temp中串的后部
strcat(temp,s.str);
//釋放本對象的數(shù)組空間,令temp成為其數(shù)組空間
delete []str;
str=temp;
size=size+s.size-1;	
}

int  String::Find(char c,int start) const
{ 
	//若start向下越界,則令start=0
	if (start<0)   start=0;
    //若start向上越界,則查找失敗,返回-1
	if (start>size-1)  return -1;
    /*使用strchr函數(shù)在當前串的位置start起查找字符
    c的首次出現(xiàn)位置,令p指向找到的字符*/
	char *p=strchr(&str[start],c);
	//若查找失敗,返回-1
	//	if (p==0)  return -1;
	//若查找成功,返回該字符所在下標
	//	return  p-str;
	int ret;
	if(p!=0)
		ret=int(p-str);
	else ret=-1;
	return ret;
}


String  String::SubStr(int index,int count)const
{ //若下標<0,則令其為0
	if (index<0)  { count+=index;  index=0; }
    //若子串的字符個數(shù)count<0,則拋出越界異常
    if (count<0)   throw OutOfBounds(); 
    /*若下標超出或等于串長,或者子串字符個數(shù)
    為0,   則返回空串對象*/
    String s;
    if (index>=size-1 || count==0)  return  s;
	/* 若子串字符個數(shù)多于串中從index開始至串尾的   字符個數(shù),令count為串中從index開始的字符個數(shù)*/
    if (count>size-index-1)   count=size-index-1;
	//釋放串對象s的字符數(shù)組空間
    delete []s.str;
	//為串對象s的字符數(shù)組分配空間
	s.str=new char[count+1];
	
	if (s.str==0)  throw NoMem();
	s.size=count+1;
	//將子串拷貝到s中并設置串結束標記’\0’
	
	char  *p,*q;  int  i;
	for ( i=0,p=s.str,q=&str[index]; i<count; i++)
		*p++=*q++;
	*p=0;
	//返回存放子串的串對象s
	return s;
}


void  String::Insert(const String &s,int index)
{
	//若插入位置向下越界,則令其為0
	if (index<0)  index=0;
	//若插入位置向上越界,則令其為串尾位置
	if (index>size-1)  index=size-1;
	//為字符數(shù)組temp分配空間,以存放插入后的串
	char *temp;
	temp=new char[size+s.size-1];   
	if (temp==0)  throw NoMem();
	//將當前串的前index個字符拷貝到temp中
	char *p,*q;  int i;
	for (i=0,p=temp,q=str; i<index; i++)
		*p++=*q++;
	//將s中存放的串放至temp中
	strcpy(p,s.str);
	p+=s.size-1;
	/*若當前串除前index個字符外還有字符,將
	剩余字符放至temp中*/
	strcpy(p,&str[index]);
	
	delete []str;
	str=temp;
	size=size+s.size-1;
}

void  String::Delete(int index,int count)
{ //若被刪字符數(shù)count<0,則拋出異常
    if (count<0)  throw OutOfBounds();
    /*若被刪位置向上越界或被刪字符數(shù)為0,則 
	不做任何刪除操作*/
    if (index>=size-1 || count==0)  return;
	/*若被刪位置向下越界,則令被刪字符數(shù)減少
	并令被刪位置為0*/
    if (index<0)  { count+=index; index=0; }
	/*若被刪字符數(shù)count多于串中從位置index開始的所有字符,則令count為串中從index開始的字符數(shù)目*/
    if (count>size-index-1)  count=size-index-1;
	//為字符數(shù)組分配空間以存放刪除后的串
	char *temp;
    temp=new char[size-count];
    if (temp==0)  throw NoMem();	
	
	/*將當前串的前index個字符拷貝到temp中
	并設置串結束符*/
	strncpy(temp,str,index);
	temp[index]='\0';
	/*若當前串從位置index起刪除count個字符
	后還有剩余字符,則將其拷貝到temp中*/
	if (index<size-count-1)    
		strcat(temp,&str[index+count]);
	/*釋放當前串對象的字符數(shù)組所占用空間,并令temp成為其數(shù)組空間*/
	delete []str;
	str=temp;
	size=size-count;
}

int String::ReadString(istream & istr,char delimiter)
{
	char temp[256];
	//從輸入流中接收一系列字符至temp,以delimiter為終止符
	if (istr.getline(temp,256,delimiter))
	{ //釋放本對象的字符數(shù)組空間
		delete []str;
		int n=strlen(temp)+1;
		//為本對象申請新的字符數(shù)組空間存放輸入的字符
		str=new char[n];
		if (str==0)  throw NoMem();
		size=n;
		//將temp中字符串拷貝到當前串中
		strcpy(str,temp);
		//返回接收到的字符數(shù)
		return size-1;
	}
	//若字符接收失敗,則返回-1	
	else return -1;  
} 



void String::PrintString()const
{cout<<str<<endl;}

void String::Prefix()
{
	int m=Length();
	delete[]pre;
	pre=new int[m+1];
	if (pre==0)throw NoMem();
	pre[0]=0;
	int k=0;
	for (int i=1;i< m;i++)
	{
		while((*(str+i-1)!=*(str+k))&&(k>0))
			k=pre[k];
		if (*(str+i-1)=*(str+k))
			pre[i]=++k;
		else pre[i]=0;
	}
	
}

void String::ModifiedPrefix()
{
	int *f;
	int m=Length();
	f=new int[m+1];
	Prefix();
	for (int i=1;i<=m;i++)
		f[i]=pre[i];
	for(i=1;i<m;i++)
	{
		int k=f[i];
		if((k==0) ||(*(str+i)!=*(str+k)))
			pre[i]=k;
		else pre[i]=pre[k];
	}
	delete []f;
}
int String::Match(String&t,int &i)
{   
	int j=0;
    int n=Length(),m=t.Length();     
	t.ModifiedPrefix();
	while( (i<=n)&& (j<m) )
	{
		if (str[i-1]==t.str[j])
		{
			i++;
			j++;
		}
		else 
			if(j==0)i++;
			else j=t.pre[j-1];
	}
	if(j<m)
		return 0;
	else
		return i-m;
}

void Mov(int Temp,int n,int flag[])
{
	for(int i= 1;i<= n;i++)
		if(flag[i]== 0)
		{
			flag[i]= Temp;
			return;
		}
}

int main()
{
	int n,m,i;
	string str1,str2;
	ifstream in("input.txt");
	getline(in,str1);
	getline(in,str2);
	
	n=str1.length()+1;
	m=str2.length()+1;
	int *flag= new int[n];
	for(i= 1;i<= n-1;i++) flag[i]=0;
	String Str1,Str2;
	
	Str1.str=new char[n];
	Str1.size=n;
	for(i= 0;i<n-1;i++) Str1.str[i]=str1.at(i);
	Str2.str=new char[m];
	Str2.size=m;
	for(i= 0;i<m-1;i++) Str2.str[i]=str2.at(i);
	
	i= 1;
	while(i<= n-1)
	{
		int Temp= Str1.Match(Str2,i);
		if(Temp!= 0)
		{
			Mov(Temp,n-1,flag);
			i= Temp+1;
		}
	}
	ofstream out("output.txt");
	if (flag[1]==0)
		out<<"0";
    else
		for(i= 1;i<= n-1;i++)
			if(flag[i]!= 0)
				out<<flag[i]<<" ";
			return 0;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩亚洲另类| 亚洲欧美一区二区视频| 亚洲成国产人片在线观看| 97精品超碰一区二区三区| 国产偷v国产偷v亚洲高清| 国产成人在线视频网址| 国产精品少妇自拍| 99久久精品99国产精品| 有码一区二区三区| 在线观看亚洲一区| 午夜欧美大尺度福利影院在线看| 欧美日韩卡一卡二| 天天操天天干天天综合网| 欧美高清性hdvideosex| 美女久久久精品| 久久综合精品国产一区二区三区| 国内成+人亚洲+欧美+综合在线| 久久久久久久久一| 不卡av在线免费观看| 亚洲影院免费观看| 欧美日韩久久不卡| 国产精品亚洲人在线观看| 亚洲国产精品成人久久综合一区| 91麻豆swag| 亚洲6080在线| 国产色综合久久| 在线观看亚洲精品| 九九热在线视频观看这里只有精品| 欧美激情一区二区三区全黄| 一本大道综合伊人精品热热 | 亚洲一区二区在线播放相泽 | 精品欧美黑人一区二区三区| 成人综合在线观看| 亚洲与欧洲av电影| 久久久一区二区三区| 色婷婷亚洲综合| 国内精品伊人久久久久av影院| 国产精品福利av| 欧美日韩国产精选| 国产91精品入口| 婷婷久久综合九色综合伊人色| 久久免费午夜影院| 在线精品国精品国产尤物884a| 久久99久久久欧美国产| 最新中文字幕一区二区三区 | 日韩欧美亚洲一区二区| 成人高清在线视频| 看片的网站亚洲| 亚洲免费观看高清完整版在线观看熊| 日韩欧美不卡在线观看视频| 色婷婷综合久久久久中文一区二区 | 久久日韩精品一区二区五区| 欧美中文字幕一区| 国产福利精品导航| 青青草成人在线观看| 亚洲天堂a在线| 国产三级久久久| 日韩视频一区二区三区| 91麻豆国产香蕉久久精品| 国产在线精品一区二区夜色| 亚洲国产一区视频| 国产精品久久久一区麻豆最新章节| 欧美一二三区在线观看| 欧美三级电影一区| 91蝌蚪国产九色| 国产成人精品免费在线| 精品一区二区三区在线播放| 首页欧美精品中文字幕| 午夜av一区二区| 亚洲国产精品一区二区久久恐怖片| 中文字幕一区二区三区四区不卡| 久久精品一区蜜桃臀影院| 日韩视频免费观看高清完整版| 欧美午夜免费电影| 色综合婷婷久久| 4438成人网| 欧美亚洲另类激情小说| 色综合视频一区二区三区高清| 福利一区二区在线观看| 国产盗摄女厕一区二区三区| 国产九九视频一区二区三区| 九九九精品视频| 久久国产精品第一页| 免费在线观看不卡| 奇米色一区二区三区四区| 日韩精品五月天| 免费成人在线播放| 麻豆精品一区二区综合av| 欧美aa在线视频| 激情综合色综合久久| 精品一区二区三区在线观看| 国产精品亚洲人在线观看| 国产精品99久久久| 成人免费av在线| 色香色香欲天天天影视综合网| 色婷婷国产精品久久包臀| 一本久久综合亚洲鲁鲁五月天| 欧美性极品少妇| 制服丝袜一区二区三区| 欧美精品xxxxbbbb| 精品国产乱码久久久久久免费 | 亚洲色图另类专区| 亚洲综合男人的天堂| 免播放器亚洲一区| 狠狠色狠狠色综合日日91app| 国产成人在线观看免费网站| 99久久精品费精品国产一区二区| 欧美人狂配大交3d怪物一区| 日韩欧美成人一区| 国产精品无码永久免费888| 一区二区国产视频| 美日韩黄色大片| 99精品一区二区三区| 欧美日韩三级视频| 日韩视频免费直播| 国产精品高潮呻吟| 首页亚洲欧美制服丝腿| 国产不卡在线一区| 中文字幕的久久| 亚洲欧美日韩人成在线播放| 亚洲影院免费观看| 久草热8精品视频在线观看| 丰满少妇久久久久久久| 99热精品一区二区| 在线观看欧美精品| 91久久精品网| 欧美精品一区二区三区高清aⅴ | 国产一区二区三区香蕉| 国产精品亚洲一区二区三区妖精 | 欧美精品久久天天躁| 欧美一区二区免费观在线| 欧美一级久久久| 国产色产综合色产在线视频| 亚洲精品视频免费观看| 日本色综合中文字幕| 国产成都精品91一区二区三| 91亚洲资源网| 51久久夜色精品国产麻豆| 精品国产免费人成电影在线观看四季| 国产欧美日韩久久| 亚洲国产日韩av| 久久www免费人成看片高清| 91亚洲精品久久久蜜桃网站 | 国产美女精品人人做人人爽| 国产美女视频一区| 色婷婷狠狠综合| 久久色成人在线| 亚洲精品成人精品456| 喷水一区二区三区| 欧美唯美清纯偷拍| 久久在线免费观看| 亚洲与欧洲av电影| 国产suv精品一区二区6| 欧美性大战久久久久久久 | 国产三区在线成人av| 亚洲色图另类专区| 国产高清不卡一区| 欧美日韩一卡二卡三卡| 国产精品国产三级国产普通话三级| 日韩中文字幕一区二区三区| 国产91丝袜在线观看| 4438成人网| 一级做a爱片久久| 国产成人夜色高潮福利影视| 欧美精品精品一区| 亚洲成av人片观看| 96av麻豆蜜桃一区二区| 亚洲精品在线观| 日韩精品电影一区亚洲| 一本色道亚洲精品aⅴ| 欧美国产禁国产网站cc| 久久99精品久久久久久久久久久久| 色天天综合色天天久久| 亚洲情趣在线观看| 国产精品综合视频| 日韩亚洲电影在线| 午夜精品成人在线| 99久久久国产精品免费蜜臀| 日本一区二区三区国色天香| 久久草av在线| 欧美一区二区三区精品| 一区二区三区中文字幕| 欧美又粗又大又爽| 亚洲精品精品亚洲| 99这里只有久久精品视频| 欧美韩日一区二区三区| 国产乱码精品一区二区三区av| 久久蜜桃av一区精品变态类天堂 | 成人在线一区二区三区| 精品久久久久99| 国产麻豆精品久久一二三| 精品国产sm最大网站免费看| 国产精品中文字幕欧美| 久久精品视频网| 国内精品久久久久影院一蜜桃| 久久女同精品一区二区| 国产麻豆精品一区二区| 一区二区三区在线不卡| 91蜜桃视频在线| 亚洲综合久久久|