Задача T3Z1. "Знову шифровка" Для отримання шифрованого повідомлення спочатку розрахуємо розмір квадрата. Для цього прочитаємо всі символи повідомлення в лінійний масив, ігноруючи символи переведення рядка. Як відомо, за переведення рядка відповідають два символи:#13(переведення рядка), та #10(повернення каретки), які розташовані поспіль. Щоб порахувати, на скільки рядків квадрата можна розбити повідомлення, потрібно добути корінь квадратний з кількості елементів масиву, в який ми записали повідомлення. Якщо добутий корінь не є цілим числом, в останньому рядку залишаться вільні місця, які потрібно заповнити символом "." . var f:text; a:array[1..5000] of char; b:array[1..80,1..80] of char; c :char; i,j,l,n,k:integer; d:real; begin assign(f,'z1.dat'); reset(f); l:=0; while not eof(f) do begin read(f,c); if (c<>#13) and (c<>#10) then begin l:=l+1; a[l]:=c end end; close(f); d:= sqrt(l); if frac(d)>0 then n:=trunc(d)+1 else n:=trunc(d); k:=1; for i:=1 to n do for j:=1 to n do if k>l then b[i,j]:='.' else begin if a[k] = ' ' then b[i,j]:='*' else b[i,j]:=a[k]; k:=k+1 end; assign(f,'z1.sol'); rewrite(f); for j:=1 to n do for i:=1 to n do write(f, b[i,j]); close(f) end. Задача T3Z2. Видалення коментарів. Застосуємо при обробці тексту програми кінцевий автомат. Кінцевим автоматом називається кінцева система станів та правил переходу між ними. Виділимо два основних стани, в яких може перебувати наш автомат: 0 - всередині коментаря; 1 - зовні коментаря. В стан 0 автомат переводить символ '{' або послідовність символів '(' та '*'. Всередині коментаря контролюємо символи, які можуть перевести автомат в стан 1 - це символ '}' та послідовність символів '*' та ')', а також переведення рядка. За виведення порожніх рядків відповідає прапорець р. Ззовні коментаря контролюємо символи, які можуть перевести автомат в стан 0, символи переведення рядка (їх два), або записуємо зчитаний символ у файл результату. При зчитуванні символа переведення рядка, рядок у файлі результату переводимо тільки у випадку, якщо не було порожнього рядка (це показує значення прапорця р). var f,f1:text; j:integer; c,c1: char; p:boolean; begin assign(f,'z2.dat'); assign(f1,'z2.sol'); reset(f); rewrite(f1); j:=1; p:=true; while not eof(f) do begin read(f,c); case j of 0 : if c='}' then j:=1 else if c='*' then begin read(f,c1) ; if c1=')' then j:=1 end else if c=#13 then begin if not p then writeln(f1); p:=true; end; 1 : begin if c='{' then j:=0 else if c='(' then begin read(f,c1); if c1='*' then j:=0 else write(f1,c,c1) end else if c=#13 then begin if not p then writeln(f1); p:=true; end else if c<>#10 then begin p:=false; write(f1,c) end end end; end; close(f1); close(f); end. Задача T3Z3. /* GCC */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define FOR(i,a,b) for(int i=(a),_b(b);i<_b;++i) #define FORD(i,a,b) for(int i=(a),_b(b);i>=_b;--i) #define REP(i,n) FOR(i,0,n) #define ALL(a) (a).begin(),a.end() #define SORT(a) sort(ALL(a)) #define UNIQUE(a) SORT(a),(a).resize(unique(ALL(a))-a.begin()) #define SZ(a) ((int) a.size()) #define pb push_back #define VAR(a,b) __typeof(b) a=(b) #define FORE(it,a) for(VAR(it,(a).begin());it!=(a).end();it++) #define X first #define Y second #define DEBUG(x) cout << #x << " = " << x << endl; #define INF 1000000000 #define CHECK typedef vector VI; typedef vector< vector > VVI; typedef pair PII; typedef vector VPII; typedef long long ll; char s[123456]; int main() { freopen("string.in", "r", stdin); freopen("string.out", "w", stdout); gets (s); #ifdef CHECK assert (strlen (s) >= 2 && strlen (s) <= 100000); for (int i = 0; s[i]; ++i) assert (s[i] >= 'a' && s[i] <= 'z'); #endif int N = strlen (s); int p = N - 1; vector ans (2); for (int i = N - 1; i >= 0; --i) { if (s[i] < s[p]) p = i; if (s[i] > s[p]) { ans[0] = i; ans[1] = p; } } if (ans[0] == ans[1]) { ans[0] = N - 2; ans[1] = N - 1; REP (i, N - 1) if (s[i] == s[i + 1]) { ans[0] = i; ans[1] = i + 1; break; } } printf ("%d %d\n", ans[0]+1, ans[1]+1); return 0; } Задача T3Z4. /* GCC */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define FOR(i,a,b) for(int i=(a),_b(b);i<_b;++i) #define FORD(i,a,b) for(int i=(a),_b(b);i>=_b;--i) #define REP(i,n) FOR(i,0,n) #define ALL(a) (a).begin(),a.end() #define SORT(a) sort(ALL(a)) #define UNIQUE(a) SORT(a),(a).resize(unique(ALL(a))-a.begin()) #define SZ(a) ((int) a.size()) #define pb push_back #define VAR(a,b) __typeof(b) a=(b) #define FORE(it,a) for(VAR(it,(a).begin());it!=(a).end();it++) #define X first #define Y second #define DEBUG(x) cout << #x << " = " << x << endl; #define INF 1000000000 #define CHECK typedef vector VI; typedef vector< vector > VVI; typedef pair PII; typedef vector VPII; typedef long long ll; int main() { freopen("tour.in", "r", stdin); freopen("tour.out", "w", stdout); int n, m; cin >> n >> m; #ifdef CHECK assert (1 <= n && n <= 100); assert (1 <= m && m <= 10000); #endif vector > a (n, vector (n)); int q, w; REP (i, m) { cin >> q >> w; #ifdef CHECK assert (1 <= q && q <= n); assert (1 <= w && w <= n); #endif --q, --w; a[q][w] = true; } #ifdef CHECK REP (i, n) REP (j, i) assert (a[i][j] + a[j][i] > 0); #endif VI b; VI c; REP (i, n) c.pb (i); random_shuffle (ALL (c)); REP (h, n) { int i = c[h]; bool ok = false; REP (j, SZ (b)) if (a[i][b[j]]) { b.insert (b.begin() + j, i); ok = true; break; } if (!ok) b.pb (i); } REP (i, SZ (b)) { if (i) cout << ' '; cout << (b[i]+1); } cout << endl; return 0; }