ウェブでの運動5_10 uva1597検索

長いライン上のSTL少し知識として、この問題は、難しいことではありません
、物品の条件について、それぞれの記事は確かに維持するためのオープンな構造であり
、それは、私が保存されたものを維持するために
、各ラインが何であるか(各行のテキスト)
各行の辞書(初期化メソッドアニー辞書を使用して5-3の例)(SETを使用して)
//にstringstreamラインのコンテンツの利用は、非常に使いやすい、という読み
(マップ付き)記事全体の辞書
だけでなく、すべてのテキスト辞書(マップ)が
主であるがあなたが使用したいものを把握する必要があり、私はそれを開始することは問題で、読んで、読んでいない、少しプラスライン上にいるかわからない
し、クエリおよび状況や統合を見ることができ、少ないコードがある...
まあ、コード(注を「 - 」多かれ少なかれがヒットプレーしないでください!!!!!!「=」)または他の私のようWAのOOO

#include <bits/stdc++.h>
using namespace std;
const char *msg[]={"Sorry, I found nothing.","==========","----------"};
typedef set<string> Set;
map <string, int> exist; //全文 
int ge;
struct stu{
	vector <string> row;	//行内容 
	vector <Set>    dic;   //行字典 
	map <string,int> you; //总文章字典 
}web[110]; 
void input();
void query(); 
int main()
{
	input(); //输入 
	query(); // 查询 
	return 0;
} 
void input()
{
    string s,buf;  Set dyz; 
	scanf("%d",&ge); getchar();
	for (int i = 0; i < ge; i++)
	{
		while(getline(cin,s))
		{
			dyz.clear();
			if(s == "**********") break;
			else web[i].row.push_back(s);
			for  (int i = 0; i < s.size(); i++)
			{
				if(isalpha(s[i])) s[i] = tolower(s[i]); else s[i] = ' ';
			}  // 标准化所存单词 
			stringstream ss(s); 
			while (ss >> buf)  
			{
				dyz.insert(buf); web[i].you[buf] = 1;
				exist[buf] = 1;
			}  //加全文单词,加行字典,加所有文本单词 
			web[i].dic.push_back(dyz); // 行字典搞完,放入 
		}
	} 
}
void query()
{
	int q;  string s,buf,s1,s2;
	scanf("%d",&q);  getchar();
	while(q--)
	{
		getline(cin,s);
		int n = s.size(),ok = 0,kefound = 1,f = 0; // f 表示找的到 
		for (int i = 0; i < n-3;i++)
		{
			if(s.substr(i,3) == "NOT")     { ok = 3; break;
			}
			else if(s.substr(i,3) == "AND"){ ok = 1; break;
			}
			else if(s.substr(i,2) == "OR") { ok = 2; break;
			}
		}
		if(!ok){  // 毫无花里胡哨的一个单词 
			 if(exist[s]){
			 	    for (int i = 0; i < ge; i++)
			 	    {
			 	    	if(!web[i].you[s]) continue; // 没发现目标
						else {
							    if( f ) puts(msg[2]);
							    else  f = 1;
							    int m = web[i].row.size();
							    for (int j = 0; j < m; j++)
							    {
							    	if( web[i].dic[j].count(s) )  cout<<web[i].row[j]<<endl;
							    }
						} 
			 	    }
			 }
		}
		else if(ok == 1 || ok == 2){  //AND 或者 OR 
			stringstream ss{s}; ss >> s1 >> buf >> s2;
		//	cout << s1 <<"  " <<s2 << endl;
			for (int i = 0; i < ge; i++)
			{
				int pke = 0;
				if(ok == 1 && web[i].you[s1] && web[i].you[s2]) pke = 1;
				else if( ok == 2 && ( web[i].you[s1] || web[i].you[s2] )) pke = 1;
				if(pke)
				{
					if(f) puts(msg[2]);
					else  f = 1;
					int m = web[i].row.size();
					for (int j = 0; j < m; j++)
					{
						if( web[i].dic[j].count(s1) || web[i].dic[j].count(s2) )
							 cout<<web[i].row[j]<<endl;	
					}
				}
			}
			
		}
		else{  // NOT 
			  stringstream ss(s); ss >> buf; ss >> buf; // buf为该单词
			 // cout<<buf<<endl; 
			  for (int i = 0; i < ge; i++)
			  {
			  		if(!web[i].you[buf])
			  		{
			  			if(f)  puts(msg[2]);
			  			else   f = 1;
			  			int m = web[i].row.size();
			  			for (int j = 0; j < m; j++)
						{
							cout<<web[i].row[j]<<endl;
						}
			  		}
			  } 
		} // 如果没找到 
		if(!f)		puts(msg[0]); puts(msg[1]);
	}
}
公開された55元の記事 ウォンの賞賛1 ビュー2652

おすすめ

転載: blog.csdn.net/qq_37548017/article/details/100346578