Hướng dẫn giải của VM 09 Bài 01 - Palindrome String


Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người viết lời giải.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.

Lưu ý: Các code mẫu dưới đây chỉ mang tính tham khảo và có thể không AC được bài tập này

Code mẫu của flashmt

const fi='';
      fo='';
      maxn=100100;
var n,re:longint;
    a:array[1..maxn] of char;
    num:array[1..62] of longint;
    b:array[1..62] of longint;
    d,dau:array[1..62] of byte;
    s:array[1..62] of char;
    r:array['0'..'z'] of longint;


procedure init;
var c:char; i:longint;
begin
     for i:=1 to 10 do
     begin
          s[i]:=chr(i+47);
          r[chr(i+47)]:=i;
     end;
     for i:=11 to 36 do
     begin
          s[i]:=chr(i+54);
          r[chr(i+54)]:=i;
     end;
     for i:=37 to 62 do
     begin
          s[i]:=chr(i+60);
          r[chr(i+60)]:=i;
     end;
end;

procedure rf;
begin
     assign(input,fi);
     reset(input);
     n:=0;
     fillchar(num,sizeof(num),0);
     fillchar(d,sizeof(d),0);
     while not eoln do
     begin
          inc(n);
          read(a[n]);
          inc(num[r[a[n]]]);
     end;
     close(input);
end;

procedure pr;
var i,j,max,sum,p,q,t:longint;
begin
     for i:=1 to 62 do b[i]:=i;
     re:=0;
     for i:=1 to n div 2 do
     begin
          p:=r[a[i]]; q:=r[a[n-i+1]];
          if b[p]<>b[q] then
          begin
               d[p]:=1; d[q]:=1;
               t:=b[p];
               for j:=1 to 62 do
                   if b[j]=t then b[j]:=b[q];
          end;
     end;
     for i:=1 to 62 do
         if (num[i]>0) and (d[i]=1) then
         begin
              p:=b[i]; d[i]:=0;
              max:=num[i]; sum:=max;
              for j:=1 to 62 do
                  if (b[j]=p) and (d[j]=1) then
                  begin
                       sum:=sum+num[j];
                       d[j]:=0;
                       if num[j]>max then max:=num[j];
                  end;
              re:=re+sum-max;
         end;
end;

procedure wf;
begin
     assign(output,fo);
     rewrite(output);
     write(re);
     close(output);
end;

begin
     init;
     rf;
     pr;
     wf;
end.

Code mẫu của happyboy99x

#include<cstdio>
#include<cstring>

char s[100000+5];
int c[256], p[256], mx[256];

void init() { for(int i = 0; i < 256; ++i) p[i] = i; }
int get(int u) { return u == p[u] ? u : p[u] = get(p[u]); }

int main() {
    scanf("%s", s);
    for(int i = 0; s[i]; ++i) ++c[s[i]], ++mx[s[i]];
    init();
    for(int i = 0, j = strlen(s) - 1; i < j; ++i, --j) {
        int x = get(s[i]), y = get(s[j]);
        if(x != y) {
            p[p[x]] = p[y]; c[y] += c[x];
            if(mx[x] > mx[y]) mx[y] = mx[x];
            c[x] = 0; mx[x] = 0;
        }
    }
    int res = 0;
    for(int i = 0; i < 256; ++i) res += c[i] - mx[i];
    printf("%d\n", res);
    return 0;
}

Code mẫu của ladpro98

program TOPALIN;
uses    math;
const   fi='';
var     a:ansistring;
        chk:array[1..100] of boolean;
        mat:array[1..100,1..100] of longint;
        w:array[1..100] of longint;
        num:array['0'..'z'] of longint;
        inp:text;
        i,n,res,sum,maxV,t:longint;
        c:char;

procedure dfs(i:longint);
var     j:longint;
begin
        chk[i]:=true;
        inc(sum,w[i]);
        maxV:=max(maxV,w[i]);
        for j:=1 to t do
        if (mat[i,j]=1) and (not chk[j]) then
        dfs(j);
end;

begin
        assign(inp,fi);reset(inp);
        readln(inp,a);close(inp);
        n:=length(a);t:=0;
        for c:='A' to 'z' do begin
                inc(t);num[c]:=t;
        end;
        for c:='0' to '9' do begin
                inc(t);num[c]:=t;
        end;
        for i:=1 to n div 2 do
        if a[i]<>a[n-i+1] then begin
                mat[num[a[i]],num[a[n-i+1]]]:=1;
                mat[num[a[n-i+1]],num[a[i]]]:=1;
        end;
        for i:=1 to n do inc(w[num[a[i]]]);
        for i:=1 to t do
        if not chk[i] then begin
                sum:=0;maxV:=0;
                dfs(i);
                res:=res+sum-maxV;
        end;
        write(res);
end.

Code mẫu của RR

//Written by RR
#include <vector>
#include <set>
#include <algorithm>
#include <string>
#include <cmath>
#include <queue>
#include <map>
#include <iostream>
#include <list>
#include <deque>
#include <cstdio>
#include <cstdlib>

#define MAXN 100111
#define FOR(i,a,b)  for(typeof(a) i=a; i<=b; i++)
#define FORD(i,a,b) for(typeof(a) i=a; i>=b; i--)
#define V vector<long>
#define Q queue<long>
#define S set<long>
#define M map<long,long>
#define FORV(i,v)  for(typeof(v.begin()) i=v.begin(); i!=v.end(); i++)
#define PB push_back
#define SZ(x) ((long) x.size())
#define MP make_pair
#define TWO(x) (long) (1<<x)
#define TWOL(x) (long long) (1<<x)

using namespace std;

typedef long long       ll;
typedef long double     ld;
typedef vector<bool>    vb;
typedef pair<long,long> ii;

long n,freq[300];
char s[MAXN];
V ke[300];

long res;

void inp() {
     scanf("%s",&s);
     n=strlen(s)-1;
     FOR(i,0,n) {
       if (s[i]!=s[n-i]) {
         ke[(long)s[i]].PB((long)s[n-i]);
         ke[(long)s[n-i]].PB((long)s[i]);
       }
     }
     FOR(i,0,n)
       freq[(long)s[i]]++;
}

long xet[MAXN];

void BFS(long start) {
     Q q;
     long u=start;
     q.push(u); xet[u]=start;
     long gtln=u;
     while (!q.empty()) {
           u=q.front(); q.pop();
           FORV(v,ke[u])
             if (xet[*v]==0) {
                             q.push(*v);
                             xet[*v]=start;
                             if (freq[*v]>freq[gtln]) gtln=*v;
             }
     }
     FOR(i,1,299)
       if (xet[i]==start && i!=gtln) res+=freq[i];
}

void solve() {
     FOR(i,1,299)
     if (xet[i]==0)
       if (!ke[i].empty()) BFS(i);
}

int main() {
    inp();
    solve();
    cout<<res<<endl;
    return 0;
}

Code mẫu của hieult

#include <cstdio>
//#include <conio.h>
#include <cstring>

struct chu
{
     int so,a[150];
};

    int tong,maxx;
    int n,c[150][150],d[150],flag[150],KQ = 0;
    char s[100010];
    chu A[150];

void  duyet(int x)
{
     flag[x] = 1;
     tong += d[x];
     if(d[x]>maxx)
         maxx = d[x];
     for(int i = 1;i<=A[x].so;i++)
         if(!flag[A[x].a[i]])
         duyet(A[x].a[i]);
}

int main()
{

    scanf("%s",s);
    n = strlen(s);
    for(int i = 0;i<150;i++)
    {
        A[i].so = 0;
        flag[i] = 0; 
        for(int j = 0;j<150;j++)
             c[i][j] = 0;
    }
    for(int i = 0;i<=(n-1)/2;i++)
    {
         if(i*2==n-1)
              d[s[i]]++;
         else
         {
              d[s[i]]++;
              d[s[n-1-i]]++;
              if(s[i]!=s[n-1-i]&& !c[s[i]][s[n-1-i]])
              {
                  c[s[i]][s[n-1-i]]=1;
                  c[s[n-1-i]][s[i]]=1;
                  A[s[i]].a[++A[s[i]].so] = s[n-1-i];
                  A[s[n-1-i]].a[++A[s[n-1-i]].so] = s[i];
              }
         }
    }
    for(int i = '0';i<='z';i++)  
    {
         if(flag[i] || !d[i])
              continue;
         else
         {
              tong = 0;
              maxx = 0;
              duyet(i);
              KQ += (tong-maxx);
         }
    }

    printf("%d",KQ);
    //getch();
}

Code mẫu của ll931110

{$MODE DELPHI}
{$H+}
program TOPALIN;
const
  input  = '';
  output = '';
  maxk = 62;
var
  s: string;
  a: array[1..maxk,1..maxk] of boolean;
  free: array[1..maxk] of boolean;
  num: array[1..maxk] of integer;
  trans: array['0'..'z'] of integer;
  list: array[1..maxk] of integer;
  n,res,count: integer;

procedure init;
var
  f: text;
begin
  assign(f, input);
    reset(f);

  readln(f, s);
  n := length(s);

  close(f);
end;

procedure DFS(u: integer);
var
  v: integer;
begin
  inc(count);
  list[count] := u;
  free[u] := false;

  for v := 1 to maxk do
    if free[v] and a[u,v] then DFS(v);
end;

procedure solve;
var
  i,j,u,v,sum,max: integer;
  ch: char;
begin
  count := 0;
  for ch := '0' to '9' do
    begin
      inc(count);
      trans[ch] := count;
    end;

  for ch := 'A' to 'Z' do
    begin
      inc(count);
      trans[ch] := count;
    end;

  for ch := 'a' to 'z' do
    begin
      inc(count);
      trans[ch] := count;
    end;

  fillchar(a, sizeof(a), false);

  fillchar(num, sizeof(num), 0);
  for i := 1 to n do
    begin
      u := trans[s[i]];
      v := trans[s[n + 1 - i]];

      inc(num[u]);
      if s[i] <> s[n + 1 - i] then a[u,v] := true;
    end;

  fillchar(free, sizeof(free), true);
  res := 0;

  for i := 1 to maxk do if free[i] then
    begin
      count := 0;
      DFS(i);
      sum := 0;
      max := 0;

      for j := 1 to count do
        begin
          sum := sum + num[list[j]];
          if max < num[list[j]] then max := num[list[j]];
        end;

      res := res + sum - max;
    end;
end;

procedure printresult;
var
  f: text;
begin
  assign(f, output);
    rewrite(f);
    writeln(f, res);
  close(f);
end;

begin
  init;
  solve;
  printresult;
end.

Code mẫu của khuc_tuan

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>

using namespace std;

char s[100010];
int n, res, total, cmax;
int C[300], a[300][300], vs[300];

void dfs(int i) {
    vs[i] = true;
    total += C[i];
    cmax = max( cmax, C[i]);
    for(int j=0;j<300;++j) 
        if(!vs[j] && a[i][j]) dfs(j);
}

int main() {
    gets(s);
    n = strlen(s);
    //printf("%d\n", n);
    for(int i=0;i<n;++i) C[s[i]]++;
    for(int i=0,j=n-1;i<j;++i,--j) a[s[i]][s[j]] = a[s[j]][s[i]] = 1;
    for(int i=0;i<300;++i)
        if(!vs[i]) {
            total = cmax = 0;
            dfs(i);
            res += total - cmax;
        }
    // cout << res << endl;
    printf("%d\n", res);
    return 0;
}

Bình luận

Hãy đọc nội quy trước khi bình luận.


Không có bình luận tại thời điểm này.