【HDOJ】1648 Keywords

PE的注意,如果没有满足条件的不输出空格。
简单模拟,暴力解。

  1 /*  */
  2 #include <iostream>
  3 #include <sstream>
  4 #include <string>
  5 #include <map>
  6 #include <queue>
  7 #include <set>
  8 #include <stack>
  9 #include <vector>
 10 #include <deque>
 11 #include <bitset>
 12 #include <algorithm>
 13 #include <cstdio>
 14 #include <cmath>
 15 #include <ctime>
 16 #include <cstring>
 17 #include <climits>
 18 #include <cctype>
 19 #include <cassert>
 20 #include <functional>
 21 #include <iterator>
 22 #include <iomanip>
 23 using namespace std;
 24 //#pragma comment(linker,"/STACK:102400000,1024000")
 25 
 26 #define sti                set<int>
 27 #define stpii            set<pair<int, int> >
 28 #define mpii            map<int,int>
 29 #define vi                vector<int>
 30 #define pii                pair<int,int>
 31 #define vpii            vector<pair<int,int> >
 32 #define rep(i, a, n)     for (int i=a;i<n;++i)
 33 #define per(i, a, n)     for (int i=n-1;i>=a;--i)
 34 #define clr                clear
 35 #define pb                 push_back
 36 #define mp                 make_pair
 37 #define fir                first
 38 #define sec                second
 39 #define all(x)             (x).begin(),(x).end()
 40 #define SZ(x)             ((int)(x).size())
 41 #define lson            l, mid, rt<<1
 42 #define rson            mid+1, r, rt<<1|1
 43 
 44 // #define DEBUG
 45 
 46 const int maxp = 55;
 47 const int maxt = 255;
 48 const int maxl = 255;
 49 const int maxn = 305;
 50 const int INF = 0x3f3f3f3f;
 51 int M[maxn], mn;
 52 int M_[maxn], mn_;
 53 map<string,int> tb;
 54 map<string,int>::iterator iter;
 55 int wc = 0, pn = 1, tn = 1;
 56 char s[maxl];
 57 
 58 typedef struct {
 59     int l;
 60     char s[maxl];
 61 
 62     void init() {
 63         int id;
 64         int len = strlen(s);
 65         int i = 0, j;
 66 
 67         mn = 0;
 68         while (i < len) {
 69             if (isspace(s[i])) {
 70                 ++i;
 71                 continue;
 72             }
 73             j = i;
 74             while (i<len && islower(s[i]))
 75                 ++i;
 76             s[i] = '\0';
 77             #ifdef DEBUG
 78                 printf("\t%s\n", s+j);
 79             #endif
 80             string str(s+j);
 81             iter = tb.find(str);
 82             if (iter == tb.end()) {
 83                 id = tb[str] = wc++;
 84             } else {
 85                 id = iter->sec;
 86             }
 87 
 88             M[mn++] = id;
 89             s[i] = ' ';
 90         }
 91 
 92         M[mn] = INF;
 93     }
 94 
 95 } profile_t;
 96 
 97 typedef struct {
 98     int a[maxn];
 99     int sz;
100 } tile_t;
101 
102 profile_t P[maxp];
103 tile_t T[maxt];
104 
105 void input_profile() {
106     scanf("%d", &P[pn].l);
107     gets(P[pn].s);
108     // getchar();
109     ++pn;
110 }
111 
112 void input_tile() {
113     int l = 0, id;
114     char ch;
115 
116     #ifdef DEBUG
117         printf("%d:\n", tn);
118     #endif
119 
120     while (1) {
121         while (1) {
122             ch = getchar();
123             if (isspace(ch))
124                 continue;
125             else
126                 break;
127         }
128 
129         if (ch == '|')
130             break;
131 
132         // have a word
133         l = 0;
134         while (1) {
135             if (isalpha(ch)) {
136                 if (isupper(ch))
137                     ch = ch - 'A' + 'a';
138                 s[l++] = ch;
139             } else if (isspace(ch) || ch=='|') {
140                 if (l) {
141                     s[l] = '\0';
142                     #ifdef DEBUG
143                         printf("\t%s\n", s);
144                     #endif
145                     string str(s);
146                     iter = tb.find(str);
147                     if (iter == tb.end()) {
148                         id = tb[str] = wc++;
149                     } else {
150                         id = iter->sec;
151                     }
152                     T[tn].a[T[tn].sz++] = id;
153                     l = 0;
154                 }
155                 break;
156             }
157 
158             ch = getchar();
159         }
160 
161         if (ch == '|') {
162             getchar();
163             break;
164         }
165     }
166 
167     ++tn;
168 }
169 
170 bool judge(int pid, int tid) {
171     int l = P[pid].l + 1;
172     int sz = T[tid].sz;
173 
174     // sort(M, M+mn);
175     
176     int tmp;
177     rep(i, 0, mn) {
178         rep(j, 0, mn) {
179             if (i == j)
180                 continue;
181             tmp = INF;
182             rep(ii, 0, sz) {
183                 if (T[tid].a[ii] != M[i])
184                     continue;
185                 rep(jj, 0, sz) {
186                     if (jj==ii || T[tid].a[jj]!=M[j])
187                         continue;
188                     tmp = min(tmp, abs(jj-ii));
189                 }
190             }
191 
192             if (tmp <= l)
193                 return true;
194         }
195     }
196 
197     return false;
198 }
199 
200 void solve_(int pid) {
201     int c = 0;
202 
203     printf("%d:", pid);
204 
205     P[pid].init();
206     rep(tid, 1, tn) {
207         if (judge(pid, tid)) {
208             if (c++)
209                 putchar(',');
210             else
211                 putchar(' ');
212             printf("%d", tid);
213         }
214     }
215 
216 
217     putchar('\n');
218 }
219 
220 void solve() {
221     rep(i, 1, pn)
222         solve_(i);
223 }
224 
225 int main() {
226     ios::sync_with_stdio(false);
227     #ifndef ONLINE_JUDGE
228         freopen("data.in", "r", stdin);
229         freopen("data.out", "w", stdout);
230     #endif
231 
232     char ch;
233 
234     while (1) {
235         ch = getchar();
236         if (ch == '#')
237             break;
238         getchar();
239         if (ch == 'P') {
240             input_profile();
241         } else {
242             input_tile();
243         }
244     }
245 
246     solve();
247 
248     #ifndef ONLINE_JUDGE
249         printf("time = %d.\n", (int)clock());
250     #endif
251 
252     return 0;
253 }

数据发生器。

  1 import sys
  2 import string
  3 from random import randint
  4 
  5 def GenWords(n = 20):
  6     ret = []
  7     lc = list(string.lowercase)
  8     llc = len(lc) - 1
  9     for i in xrange(n):
 10         length = randint(2, 5)
 11         word = ""
 12         for j in xrange(length):
 13             idx = randint(0, llc)
 14             word += lc[idx]
 15         ret.append( word )
 16     return ret
 17 
 18     
 19 def GenWord(word):
 20     op = "!#$%^&*()023+-"
 21     lop = len(op) - 1
 22     ret = ""
 23     for i in xrange(len(word)):
 24         k = randint(0, 100)
 25         if k%4 == 0:
 26             idx = randint(0, lop)
 27             ret += op[idx]
 28         if k%4 == 1:
 29             ret += word[i].upper()
 30         else:
 31             ret += word[i]
 32     return ret
 33     
 34     
 35 def GenSpace():
 36     op = " \t"
 37     length = randint(1, 3)
 38     ret = ""
 39     for i in xrange(length):
 40         k = randint(0, 1)
 41         ret += op[k]
 42     return ret
 43     
 44     
 45 def GenTile(wordList):
 46     lw = len(wordList) - 1
 47     ret = "T: "
 48     nline = randint(1, 5)
 49     lines = []
 50     for i in xrange(nline):
 51         nword = randint(2, 10)
 52         line = ""
 53         for i in xrange(nword):
 54             line += GenSpace()
 55             idx = randint(0, lw)
 56             line += GenWord(wordList[idx])
 57         lines.append(line)
 58     ret = ret + "\n".join(lines) + "|"
 59     return ret
 60 
 61     
 62 def GenPile(wordList):
 63     lw = len(wordList) - 1
 64     ret = "P: "
 65     k = randint(0, 10)
 66     ret += " %d" % k
 67     nword = randint(2, 10)
 68     for i in xrange(nword):
 69         ret += GenSpace()
 70         idx = randint(0, lw)
 71         ret += wordList[idx]
 72     return ret
 73     
 74 
 75 def GenData(fileName):
 76     wordList = GenWords()
 77     lw = len(wordList) - 1
 78     with open(fileName, "w") as fout:
 79         pn = randint(10, 20)
 80         tn = randint(10, 30)
 81         for i in xrange(pn):
 82             line = GenPile(wordList)
 83             fout.write("%s\n" % line)
 84         for i in xrange(tn):
 85             line = GenTile(wordList)
 86             fout.write("%s\n" % line)    
 87         fout.write("#\n")
 88         
 89         
 90 def MovData(srcFileName, desFileName):
 91     with open(srcFileName, "r") as fin:
 92         lines = fin.readlines()
 93     with open(desFileName, "w") as fout:
 94         fout.write("".join(lines))
 95 
 96         
 97 def CompData():
 98     print "comp"
 99     srcFileName = "F:\Qt_prj\hdoj\data.out"
100     desFileName = "F:\workspace\cpp_hdoj\data.out"
101     srcLines = []
102     desLines = []
103     with open(srcFileName, "r") as fin:
104         srcLines = fin.readlines()
105     with open(desFileName, "r") as fin:
106         desLines = fin.readlines()
107     n = min(len(srcLines), len(desLines))-1
108     for i in xrange(n):
109         ans2 = int(desLines[i])
110         ans1 = int(srcLines[i])
111         if ans1 > ans2:
112             print "%d: wrong" % i
113 
114             
115 if __name__ == "__main__":
116     srcFileName = "F:\Qt_prj\hdoj\data.in"
117     desFileName = "F:\workspace\cpp_hdoj\data.in"
118     GenData(srcFileName)
119     MovData(srcFileName, desFileName)
120     
121     

 

posted on 2016-01-16 19:59  Bombe  阅读(166)  评论(0编辑  收藏  举报

导航