0x18 总结与练习

这一章不太满意啊。。

还是有点痛苦,但就是做的挺慢啊。。。

1、就是例题

2、括号画家 感觉这种提高组类型的细节题都没什么信心啊,fail了几次才A

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;

char ss[110000];
int top,sta[110000],sum[110000];
int main()
{
    scanf("%s",ss+1);int len=strlen(ss+1);
    top=0;int mmax=0,nx=0;
    memset(sum,0,sizeof(sum));
    for(int i=1;i<=len;i++)
    {
             if(ss[i]==‘(‘)sta[++top]=0;
        else if(ss[i]==‘[‘)sta[++top]=1;
        else if(ss[i]==‘{‘)sta[++top]=2;
        else if(ss[i]==‘)‘)
        {
            if(top>0&&sta[top]==0)
            {
                sum[top-1]+=sum[top]+2;
                sum[top]=0,top--;
                nx=max(nx,sum[top]);
            }
            else
            {
                mmax=max(mmax,nx);nx=0;
                while(top>0)sum[top]=0,top--;
                sum[top]=0;
            }
        }
        else if(ss[i]==‘]‘)
        {
            if(top>0&&sta[top]==1)
            {
                sum[top-1]+=sum[top]+2;
                sum[top]=0,top--;
                nx=max(nx,sum[top]);
            }
            else
            {
                mmax=max(mmax,nx);nx=0;
                while(top>0)sum[top]=0,top--;
                sum[top]=0;
            }
        }
        else if(ss[i]==‘}‘)
        {
            if(top>0&&sta[top]==2)
            {
                sum[top-1]+=sum[top]+2;
                sum[top]=0,top--;
                nx=max(nx,sum[top]);
            }
            else
            {
                mmax=max(mmax,nx);nx=0;
                while(top>0)sum[top]=0,top--;
                sum[top]=0;
            }
        }
    }
    printf("%d\n",max(mmax,nx));
    return 0;
}

括号画家

3&&6、更加细节题,怂了

4、poj1964 这个不就是2559嘛,枚举一下列就行了(鄙视rainbowcat卖狗粮)

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;

int m,n,c[1100];
char ss[10];
void sc()
{
    for(int i=1;i<=n;i++)
    {
        scanf("%s",ss+1);
        if(ss[1]==‘R‘)c[i]=0;
        else c[i]++;
    }
}
int top,sta[1100],w[1100];
int solve()
{
    int ret=0;c[n+1]=0;
    top=0;sta[++top]=1;w[top]=1;
    for(int i=2;i<=n+1;i++)
    {
        int L=0;
        while(top>0&&c[i]<=c[sta[top]])
        {
            ret=max(ret,c[sta[top]]*(w[top]+L));
            L+=w[top];top--;
        }
        sta[++top]=i;w[top]=L+1;
    }
    return ret*3;
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int mmax=0;
        scanf("%d%d",&m,&n);
        memset(c,0,sizeof(c));
        for(int T=1;T<=m;T++)
            sc(), mmax=max(mmax,solve());
        printf("%d\n",mmax);
    }
    return 0;
}

poj1964

5、这题都做到烂了

7、Matrix 这题真是做到人心态血崩。。。首先A是到100的,我就直接把每一列长度为A的区间用两个long long存,然后xjb hash前10位弄个hash表,结果这狗逼数据居然故意卡我,弄个全是0的矩阵询问还只有最后一位1,然后我也很不要脸的把后10位hash了做。。。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL;

char ss[1100][1100],sc[1100][1100];
LL zt[1100][1100][2],hh[1100][2];

int n,m,A,B;
int nxt[1100000],last[1100000];
int point(int x,int y){return (x-1)*m+y;}
int main()
{
    scanf("%d%d%d%d",&n,&m,&A,&B);
    for(int i=1;i<=n;i++)scanf("%s",ss[i]+1);

    memset(zt,0,sizeof(zt));
    for(int i=1;i<=n-A+1;i++)
        for(int j=1;j<=m;j++)
            for(int k=1;k<=A;k++)
            {
                LL x=ss[i+k-1][j]-‘0‘;
                if(k<=50)zt[i][j][0]+=(x<<(k-1));
                else      zt[i][j][1]+=(x<<(k-51));
            }
    for(int i=1;i<=n-A+1;i++)
        for(int j=1;j<=m-B+1;j++)
        {
            int p=point(i,j);LL ke=0;
            int li=min(B,10);
            for(int k=B-li+1;k<=B;k++)
            {
                LL d=(zt[i][j+k-1][0]*7+zt[i][j+k-1][1])%1000019;
                ke=(ke*93+d)%1000019;
            }
            nxt[p]=last[ke];
            last[ke]=p;
        }

    int Q;
    scanf("%d",&Q);
    while(Q--)
    {
        for(int i=1;i<=A;i++)scanf("%s",sc[i]+1);
        memset(hh,0,sizeof(hh));
        for(int j=1;j<=B;j++)
            for(int i=1;i<=A;i++)
            {
                LL x=sc[i][j]-‘0‘;
                if(i<=50)hh[j][0]+=(x<<(i-1));
                else      hh[j][1]+=(x<<(i-51));
            }
        LL ke=0;int li=min(B,10);
        for(int k=B-li+1;k<=B;k++)
        {
            LL d=(hh[k][0]*7+hh[k][1])%1000019;
            ke=(ke*93+d)%1000019;
        }
        int QAQ=0;
        for(int k=last[ke];k;k=nxt[k])
        {
            int x,y;
            y=(k%m==0)?m:k%m;
            x=(k-y)/m+1;

            bool bk=true;
            for(int j=1;j<=B;j++)
                if(hh[j][0]!=zt[x][y+j-1][0]||
                   hh[j][1]!=zt[x][y+j-1][1])
                    {bk=false;break;}
            if(bk==true){QAQ=1;break;}
        }
        printf("%d\n",QAQ);
    }
    return 0;
}

Matrix

8、做KMP那章的时候没有最小表示法的例题,就随便找了道,结果就是这个0x15 KMP

9、poj2185 先把行hash,然后做kmp求循环节,同样把列这样搞一次,乘起来就行了

contest hunter里面还有道EXKMP的,懒得复习了zzz

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;

int n,m;
char ss[11000][110];
int ha[11000];
bool check(int x,int y)
{
    if(ha[x]!=ha[y])return false;
    for(int j=1;j<=m;j++)
        if(ss[x][j]!=ss[y][j])return false;
    return true;
}
bool check2(int x,int y)
{
    if(ha[x]!=ha[y])return false;
    for(int i=1;i<=n;i++)
        if(ss[i][x]!=ss[i][y])return false;
    return true;
}
int p[11000];
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)scanf("%s",ss[i]+1);

    for(int i=1;i<=n;i++)
    {
        ha[i]=0;
        for(int j=1;j<=m;j++)
            ha[i]=(ha[i]*47+(ss[i][j]-‘A‘+1))%1000019;
    }
    p[1]=0;int j=0;
    for(int i=2;i<=n;i++)
    {
        while(j>0&&check(i,j+1)==false)j=p[j];
        if(check(i,j+1)==true)j++;
        p[i]=j;
    }
    int d1=n-p[n];

    for(int j=1;j<=m;j++)
    {
        ha[j]=0;
        for(int i=1;i<=n;i++)
            ha[j]=(ha[j]*47+(ss[i][j]-‘A‘+1))%1000019;
    }
    p[1]=0;j=0;
    for(int i=2;i<=m;i++)
    {
        while(j>0&&check2(i,j+1)==false)j=p[j];
        if(check2(i,j+1)==true)j++;
        p[i]=j;
    }
    int d2=m-p[m];

    printf("%d\n",d1*d2);
    return 0;
}

poj2185

10、poj3630 水

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;

struct Trie
{
    int w[30];bool b;
    Trie(){}
    void clean(){b=false;memset(w,0,sizeof(w));}
}tr[1100000];int trlen;
char ss[1100000];
bool maketree()
{
    int now=0,len=strlen(ss+1);bool bk=false;
    for(int i=1;i<=len;i++)
    {
        int x=ss[i]-‘0‘;
        if(tr[now].w[x]==0)
            tr[now].w[x]=++trlen, tr[trlen].clean(), bk=true;
        now=tr[now].w[x];
        if(tr[now].b==true){bk=false;break;}
    }
    tr[now].b=true;
    return bk;
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int n;bool qwq=true;
        scanf("%d",&n);
        trlen=0;tr[trlen].clean();
        for(int i=1;i<=n;i++)
        {
            scanf("%s",ss+1);
            if(qwq==true)qwq=maketree();
        }
        if(qwq==true)printf("YES\n");
        else printf("NO\n");
    }
    return 0;
}

poj3630

11、poj1442 难度在题意。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;

int a[31000],b[31000];
priority_queue<int,vector<int>,greater<int> >q;
priority_queue<int>d;
int main()
{
    int n,m,ti,tp=1;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    for(int i=1;i<=m;i++)
    {
        scanf("%d",&ti);
        while(tp<=n&&tp<=ti)
        {
            d.push(a[tp]);tp++;
            q.push(d.top());d.pop();
        }
        printf("%d\n",q.top());
        d.push(q.top()),q.pop();
    }

    return 0;
}

poj1442

12、bzoj2288: 【POJ Challenge】生日礼物

原文地址:https://www.cnblogs.com/AKCqhzdy/p/9262414.html

时间: 2024-08-30 12:53:25

0x18 总结与练习的相关文章

CSAPP 3e: Bomb lab (phase_6)

这一关很复杂,需要非常耐心.如果感觉容易在循环中绕晕,可以参考一下我最后附上的画图分析法2333,小把戏,不过挺有用的. 先看函数phase_6: 00000000004010f4 <phase_6>: 4010f4: 41 56 push %r14 4010f6: 41 55 push %r13 4010f8: 41 54 push %r12 4010fa: 55 push %rbp 4010fb: 53 push %rbx 4010fc: 48 83 ec 50 sub $0x50,%rs

CSAPP 3e: Bomb lab (phase_5)

调出phase_5函数: 0000000000401062 <phase_5>: 401062: 53 push %rbx 401063: 48 83 ec 20 sub $0x20,%rsp 401067: 48 89 fb mov %rdi,%rbx 40106a: 64 48 8b 04 25 28 00 mov %fs:0x28,%rax ;此处搞不懂 401071: 00 00 401073: 48 89 44 24 18 mov %rax,0x18(%rsp) 401078: 31

gdb调试命令

本篇摘自互联网,纯属自己学习笔记,然分享给看到我的博客的人们. 用GDB调试程序 GDB是一个强大的命令行调试工具.大家知道命令行的强大就是在于,其可以形成执行序列,形成脚本.UNIX下的软件全是命令行的,这给程序开发提代供了极大的便利,命令行软件的优势在于,它们可以非常容易的集成在一起,使用几个简单的已有工具的命令,就可以做出一个非常强大的功能. 于是UNIX下的软件比Windows下的软件更能有机地结合,各自发挥各自的长处,组合成更为强劲的功能.而Windows下的图形软件基本上是各自为营,

完成一个简单的时间片轮转多道程序内核代码

王康 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 " 分别是1 存储程序计算机工作模型,cpu执行程序的基础流程: 2 函数调用堆栈:各种寄存器和存储主要是为了指令的传取值,通过eip,esp,eax,ebp和程序内存的分区,搭配push pop call return leave等一系列指令完成函数调用操作. 3 中断:多道批程序! 在复习一下上一讲的几个重要指令

[C语言]Base64编码解码

Base64编码解码 一,Base64编码原理 Base64编码的字符数组如下所示 : ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ 字符串转Base64编码:取3字节的字符串转换为四字节的字符串,依次往后转换.得到Base64编码字符串.具体原理如下: 1,如果需要编码的原串字节数刚好为3的倍数,那么转换规则如下: 以中文字符'严'为例,'严'字的UTF-8编码为:0xE4B8A5 = 11100100  10

Zctf-pwn

最近有了点时间,把ZCTF的pwn总结了下,就差最后一个pwn500,另找时间总结. 文件打包:http://files.cnblogs.com/files/wangaohui/attach.zip Pwn100 很明显栈溢出,但是有canary保护.但是明显的是flag已经被读入了内存.在网上找到了dragonsector写的一个pdf,知道了当__stack_check_fail时,会打印出正在运行中程序的名称,如下: 所以,我们只要将__libc_argv[0]覆盖为flag的地址就能将f

测试测试

/* 项目名称:机顶盒频道锁定 日期:2016年1月31日  23:33 版本:2.1 设计:chunli 博客:http://990487026.blog.51cto.com/ 邮箱:[email protected] 编码环境:GBK2312简体中文 μVision 版本:4.72.9.0 代码类型:C语言 功能:用导线的方式实现红外控制功能 2.0更新说明: 1, 废弃弃原来模拟按键的方式去控制机顶盒的频道,因为这种方式不稳定. 2,采用红外控制的思想,用导线代替红外发射,频道锁定迅速 2

结构体在固件库中的应用

上次介绍了一般结构体的定义以及引用方法,那么接下来将对结构体在官方固件库是如何具体使用的做出简单说明. 结构体指针成员变量引用方法是通过“→”符号来实现,比如要访问student1结构体指针指向的结构体的成员变量name,那么方法是: stuednt1—>name; 如在STM32官方固件库中对端口使用模式结构体定义如下: typedef enum { GPIO_Mode_AIN = 0x0, //模拟输入模式 GPIO_Mode_IN_FLOATING = 0x04, //浮空输入模式 GPI

16V554 的测试代码

/* SC16C554 */ #define SC16C554_BASE           ( (unsigned char *) 0x50004000 ) #define SC16C554_PORTA_BASE     ( (unsigned char *) 0x50004000 ) #define SC16C554_PORTB_BASE     ( (unsigned char *) 0x50004100 ) #define SC16C554_PORTC_BASE     ( (unsig