Hiển thị các bài đăng có nhãn Xâu. Hiển thị tất cả bài đăng
Hiển thị các bài đăng có nhãn Xâu. Hiển thị tất cả bài đăng
BCPOW - Lũy thừa

BCPOW - Lũy thừa

Link Sub: https://www.spoj.com/PTIT/problems/BCPOW/
Người Gửi: Dương Lee

  • Problem:

Cho hai số n, m nguyên dương (n,m<=200). Hỏi trong biểu diễn thập phân của tổng  S=2n+3m chữ số  Cho hai số n, m nguyên dương (n,m<=200). Hỏi trong biểu diễn thập phân của tổng  S=2^n+3^m chữ số đầu tiên là chữ số nào? 
Ví dụ : 
với n=4 , m=2 thì S=25 có chữ số đầu tiên là 2. 
Với n=8, m=4 thì s=337 có chữ số đầu là 3. 
Input
Dữ liệu vào gồm một dòng duy nhất ghi 2 số n, m cách nhau bởi dấu cách.
Output
Một số duy nhất là đáp số của bài toán.
Example:
Input
4 2
Output:
2

Input
8 4
Output:
3
  • Solution:

- n, m <= 200 nên sẽ phải dùng số nguyên lớn để xử lý (cộng string)
- Code dưới đây chia làm 2 phần: Công số nguyên lớn và Lũy thừa số nguyên lớn.
+ Cong: Để cộng hai string như một số thì ta phải quy nó về cùng chiều dài số lơn nhất, sau đó áp dụng quy tắt cộng và nhớ số từ cuối lên đầu.
VD:
a = "123"
b = "4567"
->
a = "0123"
b = "4567"
<- "+", rs = "" , remember = 0
3 + 7 + 0 = 10 -> rs =    "0"  remember = 1
2 + 6 + 1 =  9 -> rs =   "90"  remember = 0
1 + 5 + 0 =  6 -> rs =  "690"  remember = 0
0 + 4 + 0 =  4 -> rs = "4690"  remember = 0
+ Luythua: đối với luy thừa thì thực chất ta cộng nhiều số lại với nhau thôi.
VD: 2^3 = 2*2*2
-> rs = "2"
rs = rs*2
-> rs = Cong(rs, rs) = 4
rs = rs*2
-> rs = Cong(rs, rs) = 8

  • Code:

C++:

https://ideone.com/fYJSFb
#include <iostream>
#include <math.h>
using namespace std;

string Cong(string a, string b)
{
    int len = max(a.length(), b.length());
    while (a.length()<len)
        a="0"+a;
    while (b.length()<len)
        b="0"+b;
    /*
    a = 123
    b = 4567
    ->
    a = 0123
    b = 4567
    */
    string rs = "";
    int remember = 0;
    for (int i=len-1; i>=0; i--)
    {
        int n1 = a[i]-'0';
        int n2 = b[i]-'0';
        int s = n1+n2+remember;
        
        char rs_tmp = s%10 + '0';
        rs = rs_tmp + rs;
        remember = s/10;
    }
    if (remember!=0)
        return char(remember+'0')+rs;
    return rs;
}

string luythua(string x, int n, int d)
{
    if (n==0) return "1";
    else if (n==1) return x;
    string rs = x;
    for (int i=2; i<=n; i++)
    {
        string rs_tmp = rs;
        for (int j=2; j<=d; j++)
        {
            rs = Cong(rs, rs_tmp);  //2^3 = ((2)*2)*2 = ((2)+(2))+((2)+(2))
        }
    }
    return rs;
}

int main()
{
    int n, m;
    cin>>n>>m;
    string lt2 = luythua("2", n, 2);
    string lt3 = luythua("3", m, 3);
    
    string S = Cong(lt2, lt3);
    
    cout<<S[0];
    return 0;
}

JAVA:

...

Python:

...
P176PROA - ROUND 6A - Custom_Map’s Custom Name

P176PROA - ROUND 6A - Custom_Map’s Custom Name

Link Sub: https://www.spoj.com/PTIT/problems/P176PROA/
Người Gửi: Dương Lee

  • Problem:

Cuối tuần vừa rồi, Lều được Chim mời đi giao hữu kèo solo Random. Vốn là người thân thiện, nên sau buổi giao hữu, Chim có ý muốn đổi laptop với Lều thể hiện tinh thần đoàn kết, thân thiện. Về nhà Lều mở máy lên code, thì mới thấy trong máy còn sẵn một danh sách các Custom_map của Chim tạo và sợ mất dữ liệu của Chim nên Lều không xóa.  
Bây giờ Lều muốn tạo một Custom_map tuy nhiên không biết đặt tên là gì. Lâu nay Lều luôn đặt tên cho từng Custom_map trong danh sách của mình sao cho 2 tên bất kỳ trong số đó không có quan hệ xâu con. Và Lều chắc chắnsẽ tiếp tục giữ nguyên tắc đó khi thêm một Custom_map vào danh sách mà Chim sẵn có.  
Một xâu B được coi là xâu con của xâu A nếu tìm được trong A xâu C mà B = C với : C = {A[i],A[i+1],… ,A[j]} ( C là một đoạn các ký tự liên tiếp trong A).  Ví dụ : Xâu “xyz” là xâu con của “axyzb” còn “xyb” thì không.  
Hãy giúp Lều đặt tên cho map mới tạo. Đương nhiên sẽ có nhiều cách đặt tên nên hãy đưa ra cách đặt tên càng ngắn càng tốt và nếu có nhiều tên cùng độ dài thì hãy đưa ra tên có thứ tự từ điển bé nhất.
Input
- Dòng đầu tiên là số Custom_map sẵn có : N(1<=N<=30) 
- N dòng tiếp theo, mỗi dòng là một chuỗi các ký tự chữ cái in thường liên tiếp là tên của mỗi Custom_map (Độ dài chuỗi không quá 20).
Output
- In ra một chuỗi là tên của map mà Lều vừa tạo
Example:
Input
5
hocvien
hoanggia
ptit
banana
diamond
Output:
f

Input
6
aa
bcdefg
hijklm
nopqrs
tuvwxy
z
Output:
ab
  • Solution:

mình dùng thử cách duyệt toàn bộ đầu tiên mà vẫn AC nên không nghĩ cách tối ưu nữa :v
Cách làm: Liệt kê toàn bộ xâu theo thứ tự từ điển: a, b, ..., z, aa, ab, ac,... Sau đó tìm xâu đó có trong chuỗi ký tự không? Nếu không có trong chuỗi thì đó là xâu cần tìm.
cái quan trọng là liệt kê xâu trên như thế nào? Có nhiều cách nhưng code dưới đây sử dụng queue để liệt kê.
Queue:

0: ""
1: a b c d e f ... z
2: b c d e f ... z aa ab ac ad ... az
3: c d e f ... z aa ab ac ad ... az ba bb bc ... bz
...

p/s: Sử dụng tính chất của queue đó là: first in, first out.

  • Code:

C++:

https://ideone.com/3yw1Bp
#include <iostream>
#include <queue>
using namespace std;

int main ()
{
    int n;
    string total = "";
    cin>>n;
    for (int i=1; i<=n; i++)
    {
        string tmp;
        cin>>tmp;
        total+=(tmp + " ");
    }
    /*input:
    3
    a
    bv
    gva
    -> total = "a bv gva"
    */
    string base = "abcdefghijklmnopqrstuvwxyz";
    string u = "";
    queue <string> q;
    q.push(u);
    while (!q.empty())
    {
        string f = q.front();
        q.pop();
        for (int i=0; i<base.length(); i++)
        {
            string v = f+base[i];      //each v we have: a, b, c ..., z, aa, ab, ..., zz, ... aaa, ... 
            q.push(v);
            if (total.find(v)==-1)
            {
                cout<<v;
                return 0;
            }
        }
    }
    return 0;
}

JAVA:

...

Python:

...
PTIT122A - Loại bỏ dấu ngoặc thừa

PTIT122A - Loại bỏ dấu ngoặc thừa

Link Sub: http://www.spoj.com/PTIT/problems/PTIT122A/
Người Gửi: Dương Lee

  • Problem:

Cho một biểu thức đúng và thỏa mãn:
- Các biến trong biểu thức chỉ chứa các chữ cái viết hoa.
- Các toán tử trong biểu thức là ‘+’ hoặc ‘-‘ (trong biểu thức không có phép toán nhân hay chia đâu nhé ;) )
Nhiệm vụ của các bạn trong bài này sẽ là loại bỏ các dấu ngoặc thừa mà vẫn giữ nguyên ý nghĩa của biểu thức.
Input
Dữ liệu vào gồm nhiều bộ test:
- Dòng đầu tiên chứa số biểu thức M (1<=M<=10).
- M dòng tiếp theo, mỗi dòng là một biểu thức đúng, có thể có các dấu cách tùy ý trong mỗi dòng. Độ dài mỗi dòng (bao gồm cả dấu cách) không quá 255 kí tự.
Output
Với mỗi biểu thức, in ra trên một dòng riêng biệt biểu thức cùng ý nghĩa với biểu thức đã cho và không có các dấu ngoặc thừa. Chú ý: Thứ tự của các toán hạng trong biểu thức in ra và biểu thức đầu vào phải giống nhau. Các dấu cách thừa cũng phải được loại bỏ.
Example:
Input
3
(A-B + C) - (A+(B - C)) - (C-(D- E) )
((A)-( (B)))
A-(B+C)
Output:
A-B+C-(A+B-C)-(C-(D-E))
A-B
A-(B+C)

  • Solution:

- Bài này thực chất là chỉ xử lý string bình thường và độ dài xâu cũng không quá dài (255 ký tự). Nhưng nếu làm theo cách xủ lý thông thường thì quá lằng nhằng và phức tạp + time chặt = 0.214s -> Khó 1 đấm AC ^^. Vậy nên để giải quyết nhanh gọn với độ phức tạp O(n) ta sẽ dùng stack để xử lý.
- Code dưới đây chia ra 3 phần xủ lý chính:
+ xóa dấu cách (cái này quá dễ rồi, chỉ cần không duyệt dấu cách là được)
+ xóa các cặp ngoặc kiểu dạng: (a)->a, ((a+b))->(a+b), ((a+((b-c))))->(a+(b-c)). Ý tưởng chính đối với loại cặp ngoặc này đó là với mỗi lần duyệt cặp ngoặc trong stack ta xác định xem trong cặp ngoặc đó có +, - không? nếu có thì đó là cặp ngoặc của một biểu thức, nếu không thì sẽ là cặp ngoặc thừa. (Để xử lý với O(n) dùng thêm stack_index và mảng dele[] để lưu vị trí và đánh dấu lại cặp ngoặc bị thừa)
VD:
((a+b))
x[0]='(' - Stack: empty
x[1]='(' - Stack: ( 
x[2]='a' - Stack: ( (
x[3]='+' - Stack: ( ( a
x[4]='b' - Stack: ( ( a +
x[5]=')' - Stack: ( ( a + b 
->Pop() -> Stack: ( -> có '+' -> ngoặc không thừa
x[6]=')' - Stack: ( 
->Pop() -> Stack: empty -> không có '+'or'-' -> ngoặc thừa

xóa các cặp ngoặc kiểu dạng: (a+(a+b))->a+a+b, d-((a-b)+c)->d-(a-b+c). Ý tưởng chính cho đối với cặp ngoặc này là với mỗi ngoặc '(' thì xem trước nó có dấu '-' hay không? Nếu không có thì có thể xóa cặp ngoặc đó. (Dùng stack để xủ lý với phức tạp O(n)).

  • Code:

C++:

https://ideone.com/tQedM4
#include <iostream>
#include <stack>
using namespace std;

string deleteSpace (string x)   //a+ b -> a+b
{
    string rs = "";
    for (int i=0; i<x.length(); i++)
        if (x[i]!=' ')
            rs+=x[i];
    return rs;
}

string delete_1 (string x)  //delete string like (a)->a || ((a+b))->(a+b)
{
    stack <char> s;
    stack <int> index;
    int dele[300] = {0};
    for (int i=0; i<x.length(); i++)
    {
        if (x[i]==')')
        {
            int flag = 0;
            while (s.top()!='(')
            {
                char top = s.top();
                if (top=='+' || top=='-')
                    flag = 1;
                s.pop();
                index.pop();
            }
            if (flag == 0)
            {
                dele[index.top()] = 1;
                dele[i] = 1;
            }
            s.pop();
            index.pop();
        }
        else
        {
            s.push(x[i]);
            index.push(i);
        }
    }
    string rs = "";
    for (int i=0; i<x.length(); i++)
    {
        if (dele[i]==0)
            rs+=x[i];
    }
    return rs;
}

string delete_2 (string x)  //delete string like ((a+b)+c)->(a+b+c) || (a+(b-c))->(a+b-c)
{
    stack <char> s;
    stack <int> index;
    int dele[300] = {0};
    for (int i=x.length()-1; i>=0; i--)
    {
        if (x[i]=='(')
        {
            int flag = 1;
            if (i==0 || x[i-1]!='-')
                flag = 0;
            while (s.top()!=')')
            {
                s.pop();
                index.pop();
            }
            if (flag == 0)
            {
                dele[index.top()] = 1;
                dele[i] = 1;
            }
            s.pop();
            index.pop();
        }
        else
        {
            s.push(x[i]);
            index.push(i);
        }
    }
    string rs="";
    for (int i=0; i<x.length(); i++)
    {
        if (dele[i]==0)
            rs+=x[i];
    }
    return rs;
}

int main ()
{
    string str = "";
    int n;
    cin>>n;
    cin.ignore();
    while (1)
    {
        if (n==0) break;
        n--;
        getline(cin, str);
        string str_no_space = deleteSpace(str);
        string str_1 = delete_1(str_no_space);
        string str_2 = delete_2(str_1);
        cout<<str_2<<endl;
    }
    return 0;
}

JAVA:

...

Python:

...
BCPENNY - Penny Game

BCPENNY - Penny Game

Link Sub: http://www.spoj.com/PTIT/problems/BCPENNY/
Người Gửi: Dương Lee

  • Problem:

Penny Game là một trò chơi đơn giản cho hai người chơi. Trò chơi này yêu cầu mỗi người chơi chọn một dãy duy nhất ba mặt đồng xu ví dụ như HEADS TAILS HEADS (HTH). Các đồng xu sẽ được tung liên tiếp cho cho đến khi xuất hiện một trong hai dãy đã được chọn lúc đầu. Người chơi nào chọn được dãy xuất hiện đầu tiên sẽ là người thắng cuộc.
Bạn hãy viết một chương trình đọc một chuỗi 40 giá trị tung đồng xu liên tiếp và xác định mỗi một chuỗi ba mặt đồng xu xuất hiện bao nhiêu lần. Hiển nhiên, ta sẽ có 8 chuỗi 3 mặt đồng xu lần lượt là: TTT, TTH, THT, THH, HTT, HTH, HHT và HHH. Các chuỗi này có thể xếp chồng lên nhau. Ví dụ ta có 40 xu liên tiếp ở mặt HEADS thì sẽ có 38 chuỗi HHH xuất hiện
Input
Dòng đầu tiên ghi số 1 ≤ P ≤ 1000 là tổng số bộ test. Mỗi bộ test gồm 2 dòng:  
Dòng đầu tiên chứa số N là thứ tự bộ test. 
Dòng thứ hai là dãy 40 ký tự mô tả chuỗi giá trị tung đồng xu trong đó chỉ gồm hai ký tự là H và T. Không có bất cứ dấu cách nào trong các dòng dữ liệu vào.
Output
Ghi ra màn hình một dòng cho mỗi bộ test trong số đầu tiên là thứ tự bộ test. Tiếp theo là 8 số cho biết số lần xuất hiện của mỗi chuỗi 3 đồng xu theo thứ tự ở trên. Mỗi số viết cách nhau một dấu cách. Sẽ có 9 dấu cách trong mỗi dòng kết quả.
Example:
Input
4
1
HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
2
TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
3
HHTTTHHTTTHTHHTHHTTHTTTHHHTHTTHTTHTTTHTH
4
HTHTHHHTHHHTHTHHHHTTTHTTTTTHHTTTTHTHHHHT
Output:
1 0 0 0 0 0 0 0 38
2 38 0 0 0 0 0 0 0
3 4 7 6 4 7 4 5 1
4 6 3 4 5 3 6 5 6

  • Solution:

Đếm thôi! Mỗi lần có string thì ta sẽ lấy 3 kí tự liên tiếp nhau trong dãy. Với mỗi lần get được sẽ kiểm tra và đếm rồi in kết quả

  • Code:

C++:

https://ideone.com/pgRxYn
#include <iostream>
#include <string>
using namespace std;

void count (int N, string s)
{
    string tmp = "";
    int s1 = 0, s2 = 0, s3 = 0, s4 = 0, s5 = 0, s6 = 0, s7 = 0, s8 = 0;
    for (int i=0; i<s.length()-2; i++)
    {
        tmp = "";
        tmp = tmp + s[i] + s[i+1] + s[i+2];
        if (tmp == "TTT") s1++;
        else if (tmp == "TTH") s2++;
        else if (tmp == "THT") s3++;
        else if (tmp == "THH") s4++;
        else if (tmp == "HTT") s5++;
        else if (tmp == "HTH") s6++;
        else if (tmp == "HHT") s7++;
        else if (tmp == "HHH") s8++;
    }
    cout<<N<<" "<<s1<<" "<<s2<<" "<<s3<<" "<<s4<<" "<<s5<<" "<<s6<<" "<<s7<<" "<<s8<<endl;
}

int main ()
{
    int P;
    cin>>P;
    int x;
    string S;
    for (int i=1; i<=P; i++)
    {
        cin>>x;
        cin>>S;
        count (x, S);
    }
}

JAVA:

...

Python:

...
P163PROD - ROUND 3D - Nếu cuộc sống không có số 0

P163PROD - ROUND 3D - Nếu cuộc sống không có số 0

Link Sub: http://www.spoj.com/PTIT/problems/P163PROD/
Người Gửi: Dương Lee

  • Problem:

Bạn có thể tưởng tượng nếu một ngày chúng ra loại bỏ hết tất cả các số 0? Chắc chắn rằng nếu điều đó xảy ra thì sẽ có nhiều vấn đề phát sinh.  
Lấy một ví dụ đơn giản, giả sử ta có 3 số nguyên a, b, c và a + b = c. GIờ đây, nếu chúng ta bỏ hết các số 0 thì chưa chắc điều này còn đúng nữa. Nhiệm vụ của bạn là cho 2 số nguyên a, b và kiểm tra xem sau khi thực hiện phép cộng rồi xóa đi các số 0 thì kết quả của phép cộng còn đúng không.  
Ví dụ ta có: 101 + 102 = 203, sau đó xóa các số 0, ta có 11 + 12 = 23 và phép tính này vẫn đúng. Nhưng với trường hợp: 105 + 106 = 211, thì sau khi xóa các số 0 ta được 15 + 16 = 211 và phép tính này sai.
Input
Gồm 2 dòng, lần lượt chứa 2 số nguyên a và b (1 <= a, b <= 10^9).
Output
In ra “YES”, nếu sau khi xóa các số 0 mà kết quả phép tính vẫn đúng, in ra “NO” trong trường hợp ngược lại.
Example:
Input
101
102
Output:
YES

Input
105
106
Output:
NO
  • Solution:

- Bài này khá dễ khi làm theo đúng yêu cầu của đề:
Code C++ dưới đây sử dụng string để thuận tiện cho xử lí xóa số.
+ Tạo 3 hàm với các chức năng: chuyển long sang string, chuyển string sang long, xóa số 0
+ Với 3 hàm trên thì khi cần xóa số 0 ta chuyển dữ liệu về string, khi cần cộng số ta lại chuyển về long sau đó chỉ cần kiểm tra điều kiện là được.

  • Code:

C++:

https://ideone.com/0M7fQk
#include <iostream>
#include <string>
using namespace std;

long toNum (string s)
{
    long S = 0;
    for (int i=0; i<s.length(); i++)
    {
        int tmp = s[i] - '0';
        S = S*10 + tmp;
    }
    return S;
}

string toString (long x)
{
    string s = "";
    while (1)
    {
        char tmp = x%10 + '0';
        x /= 10;
        s = tmp + s;
        if (x==0) break;
    }
    return s;
}

string del_0 (string s)
{
    while (1)
    {
        int vt = s.length()-1;
        while (s[vt]!='0' && vt>=0) vt--;
        if (vt>=0)
            s.erase(s.begin()+vt, s.begin()+vt+1);
        else
            break;
    }
    return s;
}

int main ()
{
    string a, b;
    cin>>a>>b;
    
    long num_a = toNum (a);
    long num_b = toNum (b);
    long VT = toNum (del_0 (toString (num_a+num_b)));    //  (num_a+num_b) long -> string -> (delete 0) string -> long
    
    long num_a_not0 = toNum (del_0 (a));
    long num_b_not0 = toNum (del_0 (b));
    long VP = num_a_not0 + num_b_not0;
    
    if (VT==VP) cout<<"YES";
    else cout<<"NO";
    
    return 0;
}

JAVA:

...

Python:

...
P142SUMG - ROUND 2G - Mã hóa

P142SUMG - ROUND 2G - Mã hóa

Link Sub: http://www.spoj.com/PTIT/problems/P142SUMG/
Người Gửi: Sai

  • Problem:

Mã hóa là một bước quan trọng trong việc truyền thông tin. Một trong những thuật toán đơn giản đó là dịch vòng tất cả các kí tự của từ mã (nội dung cần mã hóa) sang phải d kí tự. Chẳng hạn với d = 5, kí tự ‘A’ được mã hóa bằng ‘F’, ‘B’ bằng ‘G’, ..., ‘Z’ bằng ‘E’.  
Với một nội dung đã được mã hóa, để giải mã, người ta sẽ tìm khoảng cách dịch d và sau đó dịch ngược lại nội dung sang trái d kí tự. Khoảng cách d này được tính bằng số bước dịch sang phải từ chữ cái 'E' đến chữ cái được sử dụng nhiều nhất trong nội dung đã được mã hóa.  
Cho biết nội dung sau khi được mã hóa, các bạn hãy khôi phục lại từ mã ban đầu?
Input
Dòng đầu tiên là số lượng bộ test T (T <= 100).  
Mỗi bộ test là một nội dung đã được mã hóa, gồm nhiều chuỗi các chữ cái in hoa nằm trên một dòng (<= 1000 kí tự).
Output
Với mỗi test, in ra khoảng cách d và nội dung từ mã ban đầu. Nếu không giải mã được vì có nhiều giá trị d, in ra “NOT POSSIBLE”.
Example:
Input
3
RD TQIJW GWTYMJWX INFWD JSYWNJX ZXJ F XNRUQJ JSHWDUYNTS YJHMSNVZJ
THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG
XVIDRE TFCCVXZRKV GIFXIRDDZEX TFEKVJK
Output:
5 MY OLDER BROTHERS DIARY ENTRIES USE A SIMPLE ENCRYPTION TECHNIQUE
10 JXU GKYSA RHEMD VEN ZKCFI ELUH JXU BQPO TEW
NOT POSSIBLE

  • Solution:

- Các bước làm: + Nhập vào một xâu có dấu cách. + Đếm kí tự xuất hiện nhiều nhất bằng cách dùng mảng đánh dấu. (Nếu nhiều kí tự có cùng max thì in NOT POSSIBLE). + Tìm khoảng dịch d. (*Chú ý đây là dịch phải: VD: E->B thì phải dịch: E->Z->A->B); + Dịch các kí tự với khoảng d. (*Dịch phải là mã hóa còn dịch trái là đọc xâu).

  • Code:

C++:



JAVA:


P145PROE - ROUND 5E - Trang trí

P145PROE - ROUND 5E - Trang trí

Link Sub: http://www.spoj.com/PTIT/problems/P145PROE/
Người Gửi: Dương Lee

  • Problem:

Tí và Tèo đang cùng nhau vẽ tranh. 2 bạn cần trang trí các họa tiết để làm nổi bật dòng chữ trung tâm. Cách trang trí cho mỗi chữ cái của Tí như sau:  
..#..  
.#.#.  
#.X.#  
.#.#.  
..#..  
Trong đó X là chữ cái đang trang trí. Còn cách trang trí của Tèo như sau:  
..*..  
.*.*.  
*.X.*  
.*.*.  
..*..  
Hai bạn đang tranh luận xem phân chia trang trí như thế nào. Cuối cùng, Tí là người chiến thắng, và quyết định cứ trang trí 2 chữ cái theo cách của Tí xong thì Tèo mới được trang trí cho chữ cái tiếp theo. Các khung trang trí chữ cái được nối tiếp nhau, chi tiết nào mà khung trang trí của Tí và Tèo giao nhau thì Tèo là người được ưu tiên trong trường hợp này.
Input
Một dòng duy nhất chứa xâu có độ dài <= 15 là nội dung trung tâm của bức tranh.
Output
In ra 5 dòng là bức tranh sau khi đã được 2 bạn trang trí xong.
Example:
Input
A
Output:
..#..
.#.#.
#.A.#
.#.#.
..#..

Input
DOG
Output:
..#...#...*..
.#.#.#.#.*.*.
#.D.#.O.*.G.*
.#.#.#.#.*.*.
..#...#...*..
Input
ABCD
Output:
..#...#...*...#..
.#.#.#.#.*.*.#.#.
#.A.#.B.*.C.*.D.#
.#.#.#.#.*.*.#.#.
..#...#...*...#..
  • Solution:

- Khởi tạo tranh dạng: ..?.. .?.?. ?.X.? .?.?. ..?.. - Tạo bức tranh dạng: ..?....?.. ... .?.?..?.?. ... ?.X.??.X.? ... .?.?..?.?. ... ..?....?.. ... Với ? là # hoặc * (là * khi vị trí khung tranh đó %3==0), X là kí tự theo yêu cầu của đề. - In tranh: In tranh bình thường nhưng sẽ không in 1 cột bên phải cùng của mỗi khung tranh. (*Chú ý nếu cột đó là của khung tranh '*' thì vẫn in nhưng không in cột kề phải là của khung tranh '#');

  • Code:

C++:



JAVA:


PTIT121E - Nguyên tố hóa học

PTIT121E - Nguyên tố hóa học

Link Sub: http://www.spoj.com/PTIT/problems/PTIT121E/
Người Gửi: Sai

  • Problem:

Hóa chất chỉ gồm các nguyên tố C, H, O có trọng lượng 12,1, 16 tương ứng.  
Nó được biểu diễn dạng "nén", ví dụ COOHHH là CO2H3 hay CH (CO2H) (CO2H) (CO2H) là CH(CO2H)3. 
Nếu ở dạng nén thì số lần lặp >=2 và <=9.  Tính khối lượng hóa chất.
Input
Gồm một dòng mô tả hóa chất không quá 100 kí tự chỉ gồm C, H, O, (, ), 2,..,9.
Output
Khối lượng của hóa chất (luôn <=10000).
Example:
Input
COOH
Output:
45

Input
CH(CO2H)3
Output:
148
Input
((CH)2(OH2H)(C(H))O)3
Output:
222
  • Solution:

Bài này có nhiều cách: - Cách 1: Dùng stack: + Mỗi một kí tự sẽ thêm vào stack giá trị của nó: C -> 12, H -> 1, O -> 16. + Khi gặp kí tự '(' thì push vào con 0 (Mục đích là để ngăn cách); + Khi gặp kí tự ')' thì tính tổng tất cả giá trị (+ xóa từng giá trị) từ đỉnh cho tới con 0 đầu tiên gặp. (Cái này giống như gộp phần tử). Xóa nốt con 0 và push vào giá trị tổng vừa tính. + Khi gặp kí tự từ 2->9: Lấy giá trị ở đầu và nhân với trị số rồi lại push vào stack. + Cuối cùng duyệt lại stack và tính tổng các phần tử trong stack. - Cách 2: (Admin): Dùng phương pháp trâu: Tìm con '(' và tìm con ')' tương ứng. coppy xâu trong cặp ngoặc đó rồi lặp số lần chỉ số của nó (nếu có) gán vào cuối xâu. Có nghĩa là: Sẽ chuyển toàn bộ cụm công thức hóa thành các cụm công thức đơn lẻ: VD: CH3(COOH)2 -> CH3COOHCOOH. Tham khảo cách 2 Click vào đây

  • Code:

C++:

https://ideone.com/FRWxHM

#include <iostream>
#include <string>
#include <stack>
using namespace std;

int main ()
{
    string xau;
    cin>>xau;
    stack <int> s;
    int ktAdd=0;
    for (int i=0; i<xau.length(); i++)
    {
        if (xau[i]=='(')
        {
            s.push(0);
        }
        else if (xau[i]==')')
        {
            int tmp=0;
            while (!s.empty() && s.top()!=0)
            {
                tmp+=s.top();
                s.pop();
            }
            if (!s.empty() && s.top()==0)
            {
                s.pop();
                s.push(tmp);
            }
        }
        else if (xau[i]>='0' && xau[i]<='9')
        {
            int so=xau[i]-'0';
            if (!s.empty())
            {
                int tmp = s.top();
                s.pop();
                tmp = tmp * so;
                s.push(tmp);
            } else 
            {}
        }
        else if (xau[i]=='C')
        {
            s.push(12);
        }
        else if (xau[i]=='H')
        {
            s.push(1);
        }
        else if (xau[i]=='O')
        {
            s.push(16);
        }
    }
    int S=0;
    while (!s.empty())
    {
        S+=s.top();
        s.pop();
    }
    cout<<S;
    return 0;
}

JAVA:


PTIT135F - Đếm cửa sổ

Người Gửi: Dương Lee

  • Problem:

Cửa sổ (có thể có rèm kéo) đươc biểu diễn dưới dạng 4 x 4, có 5 trạng thái như sau:

Tòa nhà có M tầng, mỗi tầng có N cửa số. Tính số cửa sổ của mỗi trạng thái.
Input
-          Dòng đầu tiên của input chứa 2 số nguyên được cách nhau bởi dấu cách ( 1 <= M, N <=100).  
-          Những dòng sau miêu tả trạng thái tòa nhà hiện tại. Mỗi cửa sổ được biểu diễn bởi 1 trong ô 4x4 như trên, và những cửa sổ được phân cách bởi ký tự “#”. Xem ví dụ input để hiểu rõ. Xây dựng miêu tả sẽ có chính xác 5M + 1 dòng, mỗi dòng có 5N + 1 ký tự.
Output
Gồm 5 số là số cửa sổ tương ứng với các trạng thái như trên của tòa nhà
Example:
Input
1 2
###########
#....#****#
#....#****#
#....#....#
#....#....#
###########
Output:
1 0 1 0 0

Input
2 3
################
#****#****#****#
#****#****#****#
#****#....#****#
#....#....#****#
################
#....#****#****#
#....#****#....#
#....#....#....#
#....#....#....#
################
Output:
1 1 2 1 1
  • Solution:

Bài này chỉ có các trường hợp của sổ như trên. Vậy thay vì duyệt toàn bộ kí tự thì chỉ cần duyệt các kí tự đại diện của nó: - Tạo mảng đánh dấu. - Nhảy tưng hàng: mỗi hàng cách nhau 5 kí tự. - Nhảy từng cột: mỗi cột cách nhau 5 kí tự - Với mỗi hàng và cột xét đến thì cho đếm tt[0]++ (là trạng thái không có *); - Duyệt k= từ hàng đó đến liên tiếp 4 hàng sau nó. Nếu hàng xét đến có '*' thì tt[k+1]++; và tt[k]--;
Xem hình để hiểu rõ hơn:

  • Code:

C++:



JAVA:


P144PROD - ROUND 4D - Hàng cây

P144PROD - ROUND 4D - Hàng cây

Link Sub: http://www.spoj.com/PTIT/problems/P144PROD/
Người Gửi: Dương Lee

  • Problem:

Trên con đường hằng ngày Tí đi học có hàng cây gồm N cây được đánh số từ 1 đến N. Tí muốn biết xem cây nào cao nhất và cây nào thấp nhất, nhưng vì hàng cây dài quá nên Tom không thể xác định được.
Các bạn hãy giúp Tí tìm ra cây cao nhất và cây thấp nhất.
Input
Có nhiều bộ test.  
Mỗi bộ test bao gồm: số nguyên dương N (N<= 20) là số cây trong hàng. N dòng tiếp theo, mỗi dòng gồm N số nguyên dương, (mỗi số <= 10^50 và có thể có chữ số 0 ở đầu), là chiều cao của mỗi cây trong hàng.  
Input kết thúc bởi số 0.
Output
Với mỗi test, in ra theo mẫu, gồm 2 số nguyên là chiều cao của cây thấp nhất và chều cao của cây cao nhất.  
Nếu tất cả các cây có chiều cao bằng nhau, ghi ra “There is a row of trees having equal height.”
Example:
Input
5
1
2
3
4
5
3
001
22
33333333333333333333333333333333333
3
1
1
1
0
Output:
Case 1: 1 5
Case 2: 1 33333333333333333333333333333333333
Case 3: There is a row of trees having equal height.

  • Solution:

Sử lí xâu: 
Hàm so sánh 2 xâu: 
- Tạo 2 xâu cần so sánh có chiều dài theo chiều dài của xâu dài nhất. 
- So sánh từng kí tự từ 0->cuối: kí tự nào lớn hơn thì số đó lơn hơn và ngược lại. VS: 2 xâu: 999 và 3 -> 999 và 003  
Hàm chuẩn hóa xâu: 
- Tách xấu: bỏ 0 ở đầu và trả về xâu mới.

  • Code:

C++:



JAVA: