⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 搜索引擎.cpp

📁 湖南大学ACM-OJ的部分题目代码
💻 CPP
字号:
#include <iostream>    //老师写的  但还为成功
#include <string>
#include <cstring>
#include <cstdio>
#include <vector>
using namespace std;

vector<string> key;
vector<string>::iterator it;
struct p
{
	int c;
	string key[250];
	int k;
};
p search[50];
string text[250];
bool search_string(p s,string t)
{
	int dis=s.c,i,j;
	int v1=0;
	int v2=0;
	bool flag=false;
	for(i=0;i<s.k-1;i++)
	{
		for(j=i+1;j<s.k;j++)
		{
			v1=v2=0;
			char *str1=new char[s.key[i].length()];				
			for(int vv=0;vv<s.key[i].length()-1;vv++)
					str1[vv]=s.key[i][vv];
			str1[vv]='\0';
			while(v1=t.find(str1,v1),v1!=-1)
			{
				v2=0;				
				char *str2=new char[s.key[j].length()];				
				for(int vvv=0;vvv<s.key[j].length()-1;vvv++)
					str2[vvv]=s.key[j][vvv];
				str2[vvv]='\0';				
				while(v2=t.find(str2,v2),v2!=-1)
				{
					cout<<v2<<","<<v1<<","<<dis<<","<<s.key[i].length()<<","<<s.key[j].length()<<endl;
					if((v2>v1)&&((s.key[i].length()+dis)>=(v2-v1)))
					{
						flag=true;
						break;
					}
					if((v2<v1)&&(s.key[j].length()+dis)>=(v1-v2))
					{
						flag=true;
						break;
					}
					v2+=s.key[j].length();
					
				}
				if(flag==true)
					break;
				v1+=s.key[i].length();
				delete []str2;
				str2=NULL;
				
			}
			delete []str1;
			str1=NULL;
			if(flag==true)
				break;
		}
		if(flag==true)
		{
			break;
		}
	}

	return flag;
}




int main()
{
	int s=0,t=0,i,j,len,vxd=0;	
	string begin,str,ss;
	char str1[80];
	bool f;
	while(cin>>begin,begin[0]!='#')//输入字符串,读两个字符,判断是否为P或T,分别对待
	{
		if(begin[0]=='P')
		{
			for(i=0;i<80;i++)
				str1[i]=' ';
			cin>>search[s].c;//搜索语句中长度
			gets(str1);			//搜索关键字全部读入	
			len=0;
			f=false;
			str="";			
			for(i=0;i<80;i++)
			{
				if(str1[i]!=' ')
				{					
					str+=str1[i];
					f=true;
				}
				else if(f)
				{				
					if(int vxt=str.find(' ',0))  //测试一下
				       cout<<vxt;
					search[s].key[len]=str;	 //关键字保存
					
					key.push_back(str);									
					str="";					
					len++;
					f=false;
				}
			}
			if(f)
			{
			  search[s].key[len]=str;			  
			  key.push_back(str);
			}
			str="";
			search[s].k=len;
			s++;
		}
		if(begin[0]=='T')  //文本输入
		{
			do
			{
				cin>>str;
				ss="";
				for(i=0;i<str.length();i++)
				{
					if(str[i]<='z'&&str[i]>='a')   //大小写切换  忽略非字母字符
						ss+=str[i];
					if(str[i]<='Z'&&str[i]>='A')
						ss+=(str[i]+'a'-'A');
					
				}
				bool flag1=false;
				for(it=key.begin();it!=key.end();it++)
				{
					if(ss.find(*it)!=-1)
					{
						flag1=true;
						break;
					}
				}
				if(flag1)
				{
				  text[t]+=ss;    //关键字留下
				}
				else
					text[t]+="1";   //非关键字转换为单一字符‘1’
				if(str.find('|',0)!=-1)   //文本结束符号
					break;
			}while(1);
			t++;
		}
	}
	int *result=new int[t];	
	for(i=0;i<s;i++)
	{
		int cx=0;
		cout<<i+1<<": ";
		for(j=0;j<t;j++)
		{
			if(search_string(search[i],text[j]))
				result[cx++]=j+1;
		}
		for(j=0;j<cx-1;j++)
			cout<<result[j]<<",";
		if(cx!=0)
			cout<<result[cx-1];
		cout<<endl;		
	}
	
	return 0;
	
}


/*   这个应该可以提交
#include <iostream>
#include <string>
#include <cstdio>
using namespace std;
int main()
{
	int s=0,t=0,i,len,vxd=0;	
	string begin,str,ss;
	char str1[80];
	bool f;
	while(cin>>begin,begin[0]!='#')//输入字符串,读两个字符,判断是否为P或T,分别对待
	{
		if(begin[0]=='P')//搜索字句测试
		{
			for(i=0;i<80;i++)
				str1[i]=' ';
			cin>>vxd;
			cout<<vxd<<endl; //**************测试   搜索语句中长度
			gets(str1);			
			cout<<str1<<endl;//**************测试  搜索关键字全部读入
			len=0;
			f=false;
			str="";			
			for(i=0;i<80;i++)
			{
				if(str1[i]!=' ')
				{					
					str+=str1[i];
					f=true;
				}
				else if(f)
				{				
					cout<<str<<endl;	 //**************测试 关键字保存													
					str="";					
					len++;
					f=false;
				}
			}
			if(f)
			{
			  cout<<str<<endl;// **************测试    有可能关键字不以空格结束
			}
			str="";
			s++;
		}
		if(begin[0]=='T')  //文本输入
		{
			do
			{
				cin>>str;
				ss="";
				for(i=0;i<str.length();i++)
				{
					if(str[i]<='z'&&str[i]>='a')   //大小写切换  忽略非字母字符
						ss+=str[i];
					if(str[i]<='Z'&&str[i]>='A')
						ss+=(str[i]+'a'-'A');
					
				}
				cout<<ss<<endl;//**************测试  文本输入
				if(str.find('|',0)!=-1)   //文本结束符号
					break;
			}while(1);
			t++;
		}
	}

	return 0;


  #include <iostream>
#include <string>
using namespace std;
string ky[100];
struct sch
{
	int len;
	int keyword;
	int m[20];
};
string tt[250];
sch p[50];
bool xs(sch s,string t)
{
    int dis=s.len,i,j;
	int v1=0;
	int v2=0;
	string str1,str2;
	bool flag=false;
	for(i=0;i<s.keyword-1;i++)
	{
		for(j=i+1;j<s.keyword;j++)
		{
			str1=ky[s.m[i]-1];			
			str2=ky[s.m[j]-1];			
			v1=v2=0;
			while(v1=t.find(str1,v1),v1!=-1)
			{
				v2=0;					
				while(v2=t.find(str2,v2),v2!=-1)
				{
					if((v2>v1)&&((str1.length()+dis)>=(v2-v1)))
					{
						flag=true;
						break;
					}
					if((v2<v1)&&(str2.length()+dis)>=(v1-v2))
					{
						flag=true;
						break;
					}
					v2+=str2.length();
					
				}
				if(flag==true)
					break;
				v1+=str1.length();
				
			}			
			if(flag==true)
				break;
		}
		if(flag==true)
		{
			break;
		}
	}
	return flag;
}
int main()
{
	int s=0,t=0,i,j,v=0,k,c;	
	string begin,str,ss;
	char str1[200];
	bool f;
	
	while(cin>>begin,begin.size()>0&&begin[0]!='#')
	{		
		if(begin[0]=='P')
		{
			c=0;
			for(i=0;i<200;i++)
				str1[i]=' ';
			cin>>p[s].len;			
			gets(str1);
			str="";
			f=false;
			for(i=0;i<strlen(str1);i++)
			{
				if(str1[i]!=' '&&str1[i]!='\0')
				{					
					str+=str1[i];
					
					f=true;
				}
				else if(f)
				{	
					
					for(j=0;j<v;j++)
					{
						if(ky[j]==str)
						{
							f=false;
							p[s].m[c++]=j+1;
							str="";
						}
					}
					if(f)
					{
						ky[v++]=str;
						p[s].m[c++]=v;
						str="";
					}				
					f=false;
				}
			}
			if(f)
			{
				for(j=0;j<v;j++)
				{
					if(ky[j]==str)
					{
						f=false;
						p[s].m[c++]=j+1;
						str="";
					}
				}
				if(f)
				{
					ky[v++]=str;
					p[s].m[c++]=v;
					str="";
				}
			}	
			p[s].keyword=c;
			s++;
		}
		if(begin[0]=='T') 
		{
			do
			{
				cin>>str;
				
				ss="";
				f=false;
				for(i=0;i<str.length();i++)
				{
					if(str[i]<='z'&&str[i]>='a')  
						ss+=str[i];
					if(str[i]<='Z'&&str[i]>='A')
						ss+=(str[i]+'a'-'A');					
					
				}
				for(i=0;i<v;i++)
				{
					if(ss==ky[i])
					{
						f=true;
						break;
					}					
				}
				if(f)
					tt[t]+=ss;
				else if(ss.length()>0)
					tt[t]+="0";
				if(str.find('|',0)!=-1)  
					break;
				
			}while(1);
			t++;
		}
	}	
    int *result=new int[t];	
	for(i=0;i<s;i++)
	{
		int cx=0;
		cout<<i+1<<": ";
		for(j=0;j<t;j++)
		{
			if(xs(p[i],tt[j]))
				result[cx++]=j+1;
		}
		for(k=0;k<cx-1;k++)
			cout<<result[k]<<",";
		if(cx!=0)
			cout<<result[cx-1];
		cout<<endl;		
	}
	
	return 0;
	
}
易老师(330412055) 19:03:31
必须保证搜索语句比文本先输入
	
}*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -