Stack&2分&并查集&Dp&Greddy_081007day2

原创 2012年03月28日 23:26:53

    今天做了关于用栈处理字符串、并查集、二分查找、Dp、Tire的题目,难度并不大,关键是细节。总结如下:

                  1、调试的时候,Fpc Doc窗口下一行只能粘贴256个字符。Debug时没有注意,导致输入不完整,输出错误答案,弄得我还以为是程序错了==最后才发现是输入不完整造成的,太坑爹了==|||

                  2、在cpp字符串处理中,string有时候比char[]更好用,值得好好研究研究。

rank.pas_code:

type Stu=record
        s:string;
        f:longint;
        end;
var
        n,m,i,j,k,ans,t:longint;
        a:array[1..10000] of Stu;
        st:string;
        ch:char;
procedure qsort(l,r:longint);
  var
        i,j:longint;
        x,y:Stu;
  begin
        i:=l;
        j:=r;
        x:=a[random(r-l+1)+l];
        repeat
                while a[i].s<x.s do inc(i);
                while x.s<a[j].s do dec(j);
                if not(i>j) then begin
                        y:=a[i]; a[i]:=a[j]; a[j]:=y;
                        inc(i);
                        dec(j);
                        end;
        until i>j;
        if i<r then qsort(i,r);
        if l<j then qsort(l,j);
  end;
function search(st:string):longint;
  var
        l,r,mid:longint;
  begin
        l:=1;
        r:=n;
        while (r>l) do begin
                mid:=(l+r)shr 1;
                if a[mid].s=st then exit(mid);
                if st<a[mid].s then r:=mid-1
                else l:=mid+1;
                end;
        exit(l);
  end;

Begin
        assign(input,'rank.in');        reset(input);
        assign(output,'rank.out');      rewrite(output);
        randomize;
        readln(n);
        for i:=1 to n do readln(a[i].s);
        qsort(1,n);
        k:=search('LazyChild');
        readln(m);
        for i:=1 to m do begin
                for j:=1 to n do begin
                        read(t);
                        read(ch);
                        readln(st);
                        inc(a[search(st)].f,t);
                        end;
                ans:=0;
                for j:=1 to n do
                        if a[j].f>a[k].f then inc(ans);
                writeln(ans+1);
                end;
        close(input);   close(output);
end.


 language.pas_code:

const
        cset=['0'..'9','+','-','*','/','=','(',')',' ',#10,#13];
var
        a,s:array[1..10000] of char;
        i,l:longint;
        t:longint;
procedure Error;
var j:longint;
begin
        writeln('NO');
        close(input);   close(output);
        halt;
end;
Begin
        assign(input,'language.in');    reset(input);
        assign(output,'language.out');  rewrite(output);
        l:=0;
        while (not EOF) do begin
                inc(l);
                read(a[l]);
                end;
        t:=0;
        i:=1;
        while i<=l do begin
                case a[i] of
                        '(':begin
                            inc(t);
                            s[t]:=a[i];
                            end;
                        ')':begin
                              if t=0 then Error;
                              dec(t);
                            end;
                        '*':if (i>1) and (a[i-1]='(') then
                            begin
                                dec(t);
                                i:=i+2;
                                while (i<=l) and ( (a[i-1]<>'*')or(a[i]<>')') )  do inc(i);
                                if i>l then Error;
                            end;
                        else if (t>0) and (not(a[i] in cset)) then Error;
                end;
                inc(i);
        end;
        if t>0 then Error;
        writeln('YES');
        close(input);   close(output);
end.

network.pas_code:

 

var
        n,d,i,x,y:longint;
        f:array[1..1001] of longint;
        fix:array[1..1001] of boolean;
        a:array[1..1001,0..1] of longint;
        ch:char;
function find(k:longint):longint;
  begin
        if f[k]=k then exit(k);
        f[k]:=find(f[k]);
        exit(f[k]);
  end;
procedure union(x,y:longint);
  var e1,e2:longint;
  begin
    e1:=find(x);
    e2:=find(y);
    if x<>y then
        f[e1]:=e2;
  end;
Begin
        assign(input,'network.in');     reset(input);
        assign(output,'network.out');   rewrite(output);
        readln(n,d);
        for i:=1 to n do begin readln(a[i,0],a[i,1]); f[i]:=i; end;

        while not EOF do begin
                read(ch);
                if ch='O' then begin
                        readln(x);
                        fix[x]:=true;
                        for i:=1 to n do
                                if fix[i] and (sqr(a[i,0]-a[x,0])+sqr(a[i,1]-a[x,1])<=d*d)
                                        then union(i,x);
                        end
                else begin
                        readln(x,y);
                        if find(x)=find(y) then writeln('SUCCESS')
                                           else writeln('FAIL');
                     end;
                end;
        close(input);   close(output);
end.

 

word.cpp_code:

/*    
	Stack算法,O(nlgn+Len)
*/
#include<iostream>
using namespace std;
const int MXN=10100;
string s[MXN];
char t[MXN*31];
int p[MXN],top=1;
int main()
{
	freopen("word.in","r",stdin);
	freopen("word.out","w",stdout);
	scanf("%s",t);
	int n=0,i,l=strlen(t),ans=1;
	for(i=0;i<l;i++) if (t[i]==','||t[i]=='.') n++;
	else s[n]+=t[i];
	sort(s,s+n);
	for(i=1;i<n;i++) if (s[i]!=s[i-1]) {
		while (top>0&&s[i].find(s[p[top-1]])!=0) top--;
		p[top++]=i;
		if (top>ans) ans=top;
	}
	cout<<ans<<endl;
}

 

word.pas_code:


 

(* 
             Tire,O(len+n) 
*)
const
    nn = 200001;

  type
    trieNode = record
      son: array['a'..'z']of longint;
      flag: boolean;
    end;

  var
    n, i, best, tot, num: longint;
    trie: array[0 .. nn]of trieNode;
    s : array[0 .. 10001] of string;
    ff : boolean;
    ch : char;

  procedure init;
    var
      ch: char;
    begin
      tot := 0;
      for ch:='a' to 'z' do trie[0].son[ch] := 0;
      trie[0].flag := false;
    end;

  procedure add(s: string);
    var
      p, i: longint;
    begin
      p := 0;
      for i:=1 to length(s) do begin
        if trie[p].son[s[i]] = 0 then begin
          inc(tot);
          trie[p].son[s[i]] := tot;
        end;
        p := trie[p].son[s[i]];
      end;
      trie[p].flag := true;
    end;

  procedure dfs(x: longint);
    var
      ch: char;
      f: boolean;
    begin
      if trie[x].flag then inc(num);
      f := true;
      for ch:='a' to 'z' do
        if trie[x].son[ch] <> 0 then begin
          f := false;
          dfs(trie[x].son[ch]);
        end;
      if f then
        if num > best then
          best := num;
      if trie[x].flag then dec(num);
    end;

  begin
	assign(input,'word.in'); reset(input);
	assign(output,'word.out'); rewrite(output);
	n := 0;
	repeat
		inc(n);
		ff := false;
		s[n] := '';
		repeat
			read(ch);
			if ch = '.' then begin
				ff := true;
				break;
			end;
			if ch = ',' then
				break;
			s[n] := s[n] + ch;
		until false;
		if ff then
			break;
	until false;
    init;
    for i:=1 to n do
      add(s[i]);
    best := 0;
    num := 0;
    dfs(0);
    writeln(best);
	close(input); close(output);
  end.


 

分的分数的分和个的法规和的分后

ak.pinterest.com/5139dxd/%E5%8C%96%E5%B7%9E%E6%89%BE%E5%B0%8F%E5%A7%90%E4%B8%8A%E9%97%A8%E6%9C%8D%E5...
  • zk3ixsx4
  • zk3ixsx4
  • 2014年07月25日 07:27
  • 162

[华为机试真题]70.分苹果

题目M个相同苹果放到N个相同篮子里有多少种放法,允许有篮子不放。1
  • SunnyYoona
  • SunnyYoona
  • 2015年07月07日 11:32
  • 2652

频分.码分.时分.波分.空分的基本原理

在数据通信中,复用技术的使用极大地提高了信道的传输效率,取得了广泛地应用。多路复用技术就是在发送端将多路信号进行组合(如广电前端使用的混合器),然后在一条专用的物理信道上实现传输,接收端再将复合信号分...
  • zhaoyazhi2129
  • zhaoyazhi2129
  • 2013年06月02日 20:43
  • 2621

【瞎扯】树上差分的基本思路

数据结构题中解法千变万化,但分析最近几年的趋势来看,有一种比较重要的思想->树上差分。(会树剖的大神不要嘲笑,虽然很多时候树剖都能很好解决QwQ)。至少,树上差分熟练的话还是可以解决很多问题的。这里就...
  • Zhayan9QvQ
  • Zhayan9QvQ
  • 2017年02月12日 09:30
  • 2862

Hive分区、分桶操作及其比较

1,Hive分区。      是指按照数据表的某列或某些列分为多个区,区从形式上可以理解为文件夹,比如我们要收集某个大型网站的日志数据,一个网站每天的日志数据存在同一张表上,由于每天会生成大量的日志,...
  • epitomizelu
  • epitomizelu
  • 2014年12月13日 17:39
  • 7352

分形几何算法和实现

初识分形 1、分形的含义: 英文单词Fractal,它是由美籍法国数学家曼德勃罗(Benoit Mandelbrot)创造出来的。其含义是不规则的、破碎的、分数的。曼德勃罗是想用此词来描述...
  • ryan_jianjian
  • ryan_jianjian
  • 2016年12月15日 22:22
  • 1968

jvm分代回收机制

虚拟机中的共划分为三个代:年轻代(Young Generation)、年老点(Old Generation)和持久代(Permanent Generation)。其中持久代主要存放的是Java类的类信...
  • huangzhaoyang2009
  • huangzhaoyang2009
  • 2013年09月21日 10:05
  • 1750

差分GPS系统概述

根据笔者目前的了解,差分GPS系统(DGPS)一般分为单站差分系统,
  • dreamdgl
  • dreamdgl
  • 2014年09月23日 10:33
  • 641

hdoj 1969 分蛋糕问题(二分法的应用)

这道题是典型的二分问题,由于没有看到其中的一个已知条件(分给每个人的蛋糕必须是整个大块的,不能东拼西凑出来的) 题目意思:我过生日请了f 个朋友来参加我的生日party,m个蛋糕,我要把它平均分给每个...
  • zhangv123
  • zhangv123
  • 2015年08月03日 22:32
  • 814

分表与分库使用场景以及设计方式

参考链接:              http://blog.csdn.net/winy_lm/article/details/50708493  一. 分表      ...
  • will5451
  • will5451
  • 2017年05月21日 23:52
  • 497
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Stack&2分&并查集&Dp&Greddy_081007day2
举报原因:
原因补充:

(最多只允许输入30个字)