Sicily/1392. Frugal Search
2011-07-28 01:05 Min·zc 阅读(157) 评论(0) 编辑 收藏 举报字符串处理,要求找出满足条件的字典序最小的单词
要求:
1.结果单词至少含有查询单词的一个字母
2.如果字母在‘+’后面,那么这个字母必须出现在结果单词中
3.如果字母在‘-’后面,那么这个字母必须不能出现在结果单词中
4.在一个查询中可以包含多个单词,多个单词使用‘|’分割,只要其中的一个单词满足就可以
变量get表示单词是否满足条件1
变量los表示单词是否满足条件2和3
1 #include <set>
2 #include <iostream>3 #include <string>
4 using namespace std;
5 int main()
6 {
7 char x;
8 string word;
9 while(true)
10 {
11 set<string> s;
12 cin>>word;
13 if(word=="#")
14 break;
15 while(word!="*")
16 {
17 s.insert(word);
18 cin>>word;
19 }
20 cin>>word;
21 while(word!="**")
22 {
23 set<string>::iterator si;
24 int len=word.size();
25 int los=0;
26 int get=0;
27 for(si=s.begin();si!=s.end();si++)
28 {
29 get=0;
30 los=0;
31 int func=0;
32 for(int i=0;i!=len;i++)
33 {
34 if(word[i]=='+')
35 {
36 func=1;
37 continue;
38 }
39 if(word[i]=='-')
40 {
41 func=2;
42 continue;
43 }
44 if(word[i]=='|'&&(los==1||get==0))
45 {
46 los=0;
47 func=0;
48 get=0;
49 continue;
50 }
51 int len2=(*si).size();
52 if(los==0)
53 {
54 if(func==0&&get==0)
55 {
56 for(int j=0;j!=len2;j++)
57 if((*si)[j]==word[i])
58 get=1;
59 }
60 if(get==1&&func==1)
61 {
62 int f=0;
63 for(int j=0;j!=len2;j++)
64 if((*si)[j]==word[i])
65 f=1;
66 if(f==0)
67 los=1;
68 }
69 if(get==1&&func==2)
70 {
71 int f=0;
72 for(int j=0;j!=len2;j++)
73 if((*si)[j]==word[i])
74 f=1;
75 if(f==1)
76 los=1;
77 }
78 }
79 //cout<<get<<" "<<los<<" "<<word[i]<<" "<<(*si)[2]<<endl;
80 }
81 if(get==0)
82 los=1;
83 if(los==0)
84 {
85 cout<<(*si)<<endl;
86 break;
87 }
88 }
89 if(los==1)
90 cout<<"NONE"<<endl;
91 cin>>word;
92 }
93 cout<<"$"<<endl;
94 }
95 }