uva 1597 Searching the Web (wrong)

题目:Searching the Web


思路:

做了几天,还是没过,先把错误记录下:

(1)每输入一个指令,在文章中查找一遍。(TLE)

(2)每个单词都对应一些文章号和行号,先处理后直接查找打印。(WA)


代码:

//TLE代码

#include<cstdio>
#include<iostream>
#include<string>
#include<vector>
#include<set>
#include<map>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;

int n,m;
vector<string> Passage[105];
vector<string> p[105];

void FIND(string x) {
	vector<int> vec;
	for(int i=1; i<=n; i++) {
		for(int j=0; j<Passage[i].size(); j++) {
			if(p[i][j].find(x)!=string::npos) {
				vec.push_back(i);
				break;
			}
		}
	}
	if(vec.size()==0) {
		cout<<"Sorry, I found nothing.\n";
		return ;
	}
	for(int i=0; i<vec.size()-1; i++) {
		for(int j=0; j<Passage[vec[i]].size(); j++) {
			if(p[vec[i]][j].find(x)!=string::npos)
				cout<<Passage[vec[i]][j]<<endl;
		}
		cout<<"---------\n";
	}
	for(int j=0; j<Passage[vec[vec.size()-1]].size(); j++) {
		if(p[vec[vec.size()-1]][j].find(x)!=string::npos)
			cout<<Passage[vec[vec.size()-1]][j]<<endl;
	}
}

void AND(string x,string y) {
	vector<int> vec;
	for(int i=1; i<=n; i++) {
		bool f1=false,f2=false;
		for(int j=0; j<Passage[i].size(); j++) {
			if(p[i][j].find(x)!=string::npos) {
				f1=true;
			}
			if(p[i][j].find(x)!=string::npos) {
				f2=true;
			}
		}
		if(f1==true&&f2==true) vec.push_back(i);
	}
	if(vec.size()==0) {
		cout<<"Sorry, I found nothing.\n";
		return ;
	}
	for(int i=0; i<vec.size()-1; i++) {
		for(int j=0; j<Passage[vec[i]].size(); j++) {
			if(p[vec[i]][j].find(x)!=string::npos||p[vec[i]][j].find(y)!=string::npos)
				cout<<Passage[vec[i]][j]<<endl;
		}
		cout<<"---------\n";
	}
	for(int j=0; j<Passage[vec[vec.size()-1]].size(); j++) {
		if(p[vec[vec.size()-1]][j].find(x)!=string::npos||p[vec[vec.size()-1]][j].find(y)!=string::npos)
			cout<<Passage[vec[vec.size()-1]][j]<<endl;
	}
}

void OR(string x,string y) {
	vector<int> vec;
	for(int i=1; i<=n; i++) {
		for(int j=0; j<Passage[i].size(); j++) {
			if(p[i][j].find(x)!=string::npos||p[i][j].find(y)!=string::npos) {
				vec.push_back(i);
				break;
			}
		}
	}
	if(vec.size()==0) {
		cout<<"Sorry, I found nothing.\n";
		return ;
	}
	for(int i=0; i<vec.size()-1; i++) {
		for(int j=0; j<Passage[vec[i]].size(); j++) {
			if(p[vec[i]][j].find(x)!=string::npos||p[vec[i]][j].find(y)!=string::npos)
				cout<<Passage[vec[i]][j]<<endl;
		}
		cout<<"---------\n";
	}
	for(int j=0; j<Passage[vec[vec.size()-1]].size(); j++) {
		if(p[vec[vec.size()-1]][j].find(x)!=string::npos||p[vec[vec.size()-1]][j].find(y)!=string::npos)
			cout<<Passage[vec[vec.size()-1]][j]<<endl;
	}
}

void NOT(string x) {
	vector<int> vec;
	for(int i=1; i<=n; i++) {
		bool f=false;
		for(int j=0; j<Passage[i].size(); j++) {
			if(p[i][j].find(x)!=string::npos) {
				f=true;
			}
		}
		if(f==false) {
			vec.push_back(i);
		}
	}
	if(vec.size()==0) {
		cout<<"Sorry, I found nothing.\n";
		return ;
	}
	for(int i=0; i<vec.size()-1; i++) {
		for(int j=0; j<Passage[vec[i]].size(); j++) {
			cout<<Passage[vec[i]][j]<<endl;
		}
		cout<<"---------\n";
	}
	for(int j=0; j<Passage[vec[vec.size()-1]].size(); j++) {
		cout<<Passage[vec[vec.size()-1]][j]<<endl;
	}
}

int main() {
//	freopen("5.5 1597.out","w",stdout);
	scanf("%d",&n);
	getchar();
	for(int i=1; i<=n; i++) {
		string x;
		while(getline(cin,x)&&x[0]!='*') {
			Passage[i].push_back(x);
			for(int j=0; j<x.size(); j++) {
				if('A'<=x[j]&&x[j]<='Z') x[j]=x[j]-'A'+'a';
			}
			p[i].push_back(x);
		}
	}

	scanf("%d",&m);
	string x;
	getchar();
	while(getline(cin,x)&&m--) {
		if(x[0]=='N') {
			x=x.substr(4,x.size()-4);
			NOT(x);
		} else if(x.find(" AND ")!=string::npos) {
			int y=x.find(" AND ");
			string one=x.substr(0,y);
			string two=x.substr(y+5,x.size()-y-5);
			AND(one,two);
		} else if(x.find(" OR ")!=string::npos) {
			int y=x.find(" OR ");
			string one=x.substr(0,y);
			string two=x.substr(y+4,x.size()-y-4);
			OR(one,two);
		} else {
			FIND(x);
		}
		cout<<"==========\n";
	}

	return 0;
}



//WA代码

#include<cstdio>
#include<iostream>
#include<string>
#include<vector>
#include<set>
#include<map>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;

struct Pair {
	int x,y;
	Pair() {}
	Pair(int one,int two) {
		x=one,y=two;
	}
	bool operator < (const Pair& other) const {
		if(x<other.x||(x==other.x&&y<other.y)) return true;
		return false;
	}
	bool operator == (const Pair& other) const {
		if(x==other.x&&y==other.y) return true;
		return false;
	}
};

int n,m;
vector<string> Passage[105];
map<string,vector<Pair> > mp;

int main() {
//	freopen("5.5 1597.out","w",stdout);
	scanf("%d",&n);
	getchar();

	for(int i=0; i<n; i++) {
		string x;
		while(getline(cin,x)&&x[0]!='*') {
			Passage[i].push_back(x);
			for(int j=0; j<x.size(); j++) {
				if('A'<=x[j]&&x[j]<='Z') x[j]=x[j]-'A'+'a';
			}
			x+=" ";
			string w;
			map<string,bool> a;
			for(int j=0; j<x.size(); j++) {
				if(isalpha(x[j])) {
					w+=x[j];
				} else if(j!=0&&isalpha(x[j-1])) {
					if(!a.count(w))
						mp[w].push_back(Pair(i,Passage[i].size()-1));
					a[w]=true;
					w.clear();
				}
			}
		}
	}

	for(map<string,vector<Pair> >::iterator it=mp.begin();it!=mp.end();it++){
		sort(mp[(it->first)].begin(),mp[(it->first)].end());
//		cout<<(it->first)<<" ----- \n";
//		for(int i=0;i<(it->second).size();i++){
//			cout<<"    "<<(it->second)[i].x<<' '<<(it->second)[i].y<<' '<<Passage[(it->second)[i].x][(it->second)[i].y]<<endl;
//		}
//		cout<<endl;
	}

	scanf("%d",&m);
	getchar();
	while(m--) {
		string x;
		getline(cin,x);
		if(x[0]=='N') {
			x=x.substr(4,x.size()-4);

			vector<Pair> vec=mp[x];
			bool a[105]= {0};
			for(int i=0; i<vec.size(); i++) {
				a[vec[i].x]=true;
			}
			bool flag=false;
			for(int i=0; i<n; i++) {
				if(!a[i]) {
					if(flag==true) printf("----------\n");
					else flag=true;
					for(int j=0; j<Passage[i].size(); j++) {
						cout<<Passage[i][j]<<endl;
					}
				}
			}
			if(flag==false) printf("Sorry, I found nothing.\n");
		} else if(x.find(" AND ")!=string::npos) {
			int y=x.find(" AND ");
			string one=x.substr(0,y);
			string two=x.substr(y+5,x.size()-y-5);

			if(!mp.count(one)||!mp.count(two)) printf("Sorry, I found nothing.\n");
			else {
				vector<Pair> vec=mp[one],t=mp[two];
				bool a[105]= {0},c[105]={0};
				for(int i=0; i<vec.size(); i++) {
					a[vec[i].x]=true;
				}
				for(int i=0; i<t.size(); i++) {
					c[t[i].x]=true;
				}
				for(int i=0;i<n;i++){
					a[i]&=c[i];
				}
				for(int i=0; i<t.size(); i++) {
					vec.push_back(t[i]);
				}
				sort(vec.begin(),vec.end());
				bool b[2000]= {0};
				for(int i=1; i<vec.size(); i++) {
					if(vec[i]==vec[i-1]) b[i]=true;
				}
				int lastp=-1;
				for(int i=0; i<vec.size(); i++) {
					if(b[i]) continue;
					int p=vec[i].x,r=vec[i].y;
					if(!a[p]) continue;
					if(p!=lastp&&lastp!=-1) {
						printf("----------\n");
					}
					lastp=p;
					cout<<Passage[p][r]<<endl;
				}
			}
		} else if(x.find(" OR ")!=string::npos) {
			int y=x.find(" OR ");
			string one=x.substr(0,y);
			string two=x.substr(y+4,x.size()-y-4);

			if(!mp.count(one)&&!mp.count(two)) printf("Sorry, I found nothing.\n");
			else {
				vector<Pair> vec=mp[one],t=mp[two];
				for(int i=0; i<t.size(); i++) {
					vec.push_back(t[i]);
				}
				sort(vec.begin(),vec.end());
				bool b[2000]= {0};
				for(int i=1; i<vec.size(); i++) {
					if(vec[i]==vec[i-1]) b[i]=true;
				}
				int lastp=-1;
				for(int i=0; i<vec.size(); i++) {
					if(b[i]) continue;
					int p=vec[i].x,r=vec[i].y;
					if(p!=lastp&&lastp!=-1) {
						printf("----------\n");
					}
					lastp=p;
					cout<<Passage[p][r]<<endl;
				}
			}
		} else {
			if(!mp.count(x)) printf("Sorry, I found nothing.\n");
			else {
				vector<Pair> vec=mp[x];
				int lastp=-1;
				for(int i=0; i<vec.size(); i++) {
					int p=vec[i].x,r=vec[i].y;
					if(p!=lastp&&lastp!=-1) {
						printf("----------\n");
					}
					lastp=p;
					cout<<Passage[p][r]<<endl;
				}
			}
		}
		cout<<"==========\n";
	}

	return 0;
}




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值