BI-EP2 Efektivní programování 2 LS 2012/2013 Ing. Martin Kačer, Ph.D. 2013 Martin Kačer Katedra teoretické informatiky Fakulta informačních technologií České vysoké učení technické v Praze Vznik předmětu byl podpořen FRVŠ v rámci projektu 2581/2011
2
3
int array[maxlen][maxlen]; int solve() { int res=0; for(int i=0; i<first.length(); i++) { for(int j=0; j<second.length(); j++) { if(first[i]==second[j]) { array[i+1][j+1]=array[i][j]+1; res=max(res,array[i+1][j+1]); else array[i+1][j+1] = 0; return res; 4
int array [2][10010]; for (int i = 1; i <= len1; ++i) { for (int j = 1; j <= len2; ++j) { if (s1[i-1]==s2[j-1]) array[i%2][j] =1+array[1-i%2][j-1]; else array[i%2][j]=0; if (array[i%2][j]>max) max=array[i%2][j]; 5
for (unsigned i=0; i<strlen(str1)-1; i++) { occurence[(int)str1[i]].push_back(i); int longest = 0; for(i=0; i<strlen(str2)-1; i++) { if (i+longest >= strlen(str2)) break; for (j=0; j<occurence[(int)str2[i]].size(); j++) { unsigned pos = occurence[(int)str2[i]][j]; if (pos+longest >= strlen(str1)) break; for (int k=strlen(str2)-i-1; k>longest; k--) { if (strncmp(str2+i, str1+pos, k) == 0) { longest = k; break; => O(n 3 ) 6
for(int a = 0; a < len1; a++) { for(int i = a, j = 0; i < len1 && j < len2; i += move, j += move) { if(str1[i] == str2[j]) { match = 1; for(int i2 = i, j2 = j; i2 > 0 && j2 > 0; ) { i2--; j2--; if(str1[i2] == str2[j2]) match++; else break; for(int i2 = i, j2 = j; i2 < len1-1 && j2 < len2-1; ) { i2++; j2++; if(str1[i2] == str2[j2]) match++; else break; if(match >= move) move = match+1; for(int a = 1; a < len2; a++) { for(int i = 0, j = a; i < len1 && j < len2; i += move, j += move) { if(str1[i] == str2[j]) { match = 1; for(int i2 = i, j2 = j; i2 > 0 && j2 > 0; ) { i2--; j2--; if(str1[i2] == str2[j2]) match++; else break; for(int i2 = i, j2 = j; i2 < len1-1 && j2 < len2-1; ) { i2++; j2++; if(str1[i2] == str2[j2]) match++; else break; if(match >= move) move = match+1; 7
int findlongest(string &longer, string &shorter); if (first.length()>second.length()) { findlongest(first, second); else { findlongest(second, first); 8
for ( int i = 0; i < l1 + l2; i++ ) { int b1 = i; int b2 = l2-1; while ( b1 >= 0 && b2 >= 0 ) { if ( b1 < l1 ) { if ( s1.charat(b1) == s2.charat(b2) ) { samelen++; max = Math.max( samelen, max ); else { samelen = 0; b1--; b2--; samelen = 0; 9
10
void DFS(list<pair<int,int> > & stck, int num) { visited[num]=true; l++; for(int i=0;i<neighb[num].size();i++) { if(! visited[ neighb[num][i] ]) DFS(stck, neighb[num][i]); l++; stck.push_front(make_pair(l,num)); 11
void quicksort(int *A, int low, int high) { int idxr = high, idxl = low, pivot = A[low]; do { while (idxl <= high && A[idxL] < pivot) idxl++; while (idxr >= low && A[idxR] > pivot) idxr--; if (idxl <= idxr) swap(a[idxl++],a[idxr--]); while (idxl <= idxr); if (low < idxr) quicksort(a,low,idxr); if (high > idxl) quicksort(a,idxl,high); return; quicksort(siblings[i],0,siblingscnt[i]-1); 12
while ( begin < end ) { qsort(queue+begin, end-begin,...); for ( i = 0; i < edgecnt[queue[begin]]; i++ ) { edgesin[matrix[i][queue[begin]]]--; if (edgesin[matrix[i][queue[begin]]]==0) queue[end++] = matrix[i][queue[begin]]; printf ( " %s", beverages[queue[begin++]].c_str() ); 13
while(1){ for(j = 0; j < n; j++){ if (!gin[j]){ printf(" %s", s[j]); gin[j] = -1; for(i = 0, i < gc[j]; i++){ gin[ gn[j][i] ]--; break; if (j==n) break; 14
for(int i = 0; i < n; i++){ if(is_root[i]){ dfs(graph, i, visited, node_order, t); for(int i = 0; i < n; i++){ int j = i; while(j > 0 && node_order[j - 1] > node_order[j] &&!neighbour_matrix[node_order[j - 1]] [node_order[j]]){ int tmp = node_order[j - 1]; node_order[j - 1] = node_order[j]; node_order[j] = tmp; j--; 15
fori(i,0,n) if(!edges[i]){ q.push(i); vis[i] = true; fori(j,0,n) if(g[i][j]) edges[j]--; break; int temp; while(!q.empty()){ temp = q.front(); q.pop(); cout << " " << mback[temp]; fori(i,0,n) if(!edges[i] &&!vis[i]){ vis[i] = true; q.push(i); fori(j,0,n) if(g[i][j]) edges[j]--; break; 16
while(qb!= qe) { b = q[qb++]; for(int i = 0; i < g2c[b]; i++) { b2 = g2[b][i]; gc[b2]--; for(int i = 0; i < n; i++) { if(gc[i] == 0) { q[qe++] = i; gc[i] = -1; break; 17
graph[tmp->successors[i]].incoming--; if(graph[tmp->successors[i]].incoming==0) { qu.push(&graph[tmp->successors[i]]); vs. if(--graph[tmp->successors[i]].incoming==0) { qu.push(&graph[tmp->successors[i]]); 18
19
scanf("%d %d", &a, &b); uzly[a]=1; uzly[b]=2; for(int i=1; i<pocethran; i++) { scanf("%d %d", &a, &b); if(uzly[a]==1) { if(uzly[b]!=1) uzly[b]=2; else { cout << "NO" << endl; break; if(uzly[a]==2) { if(uzly[b]!=2) uzly[b]=1; else { cout << "NO" << endl; break; cout << "YES" << endl; 20
while (qb!= qe) { u = q[qb++]; for (i = 0; i < gc[u]; i++) { v = gn[u][i]; if ((gstate[v]==open) && (gcolor[v]==gcolor[u])) { return 0; else if (gstate[v] == FRESH) { gstate[v] = OPEN; gcolor[v] = (gcolor[u] == BLACK? RED : BLACK); q[qe++] = v; gstate[u] = CLOSED; 21
for(i=0; i<e; i++) { int a, b; cin >> a >> b; if(!ver[a] &&!ver[b]) {ver[a] = 1; ver[b] = 2; else if(!ver[a]) ver[a] = (ver[b]==1?2:1); else if(!ver[b]) ver[b] = (ver[a]==1?2:1); else if(ver[a]==ver[b]) okay = false; 22
while(!toexpand.empty()) { toexpand.pop(); // arghh! vs. toexpand.clear(); 23
e a b b f a b b d d a a b b a a c d a b c 24
for (int i = 0; i < len; ++i) str[i+len] = str[i]; str[2*len] = '\0'; for (int i = 1; i < len; ++i) { min = str[*l.begin() + i]; for (list<int>::iterator it = l.begin(); it!= l.end(); ++it) {... 25
int i = 0, j = 1, k = 0; while (i < len && j < len && k < len) { if (str[i+k] == str[j+k]) ++k; if (str[i+k] > str[j+k]) { i = max(i+k+1, j+1); k = 0; else if (str[i+k] < str[j+k]) { j = max(j+k+1, i+1); k = 0; 26
step = 1; while ( startcnt > 1 ) { if ( step == len ) break; min = 127; for ( i = 0; i < startcnt; i++ ) if ( necklace[starts[i]+step] < min ) min = necklace[starts[i]+step]; pom = 0; for ( i = 0; i < startcnt; i++ ) if ( necklace[starts[i]+step] == min ) starts[pom++] = starts[i]; startcnt = pom; step++; 27