hdu4119 模拟

http://acm.hdu.edu.cn/showproblem.php?pid=4119

解密文,解密的方式是有一个字符矩阵,一个mask矩阵,如果一个mask矩阵,mask矩阵盖在字符举证上,从上到下,从左到右露出来的是密文的一部分,然后把mask矩阵旋转一周,四个90度下的密文一部分加在一起就是密文的内容,但是因为初识的mask角度未知,所以密文不止一种。给出一个认识的字符串的集合,答案是是由集合内组成的前提下字典序最小的密文。

我的原来的代码改不过来了,照着别人ac的代码模仿了一份,发现错误:

1.出现在我以为可能的密文就是4个90度下的字符串数组的排列组合的连接,实际上4个90度是有先后关系的,密文只有4种。

2.我没有合并中间连续的多个空格.解决这个的方式其实是优点类似于自动机的。不问由来,只问状态

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<algorithm>
#include<functional>
#include<iostream>
#include<cmath>
#include<string>
#include<cctype>
#include<stack>
#include<queue>
#include<set>
#include<sstream>
#include<map>
#include<ctime>
using namespace std;
#define For(i,k,n) for(int i=k;i<=n;i++)
#define ForD(i,k,n) for(int i=n;i>=k;i--)
#define Lson (x<<1)
#define Rson ((x<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define NEG(a) memset(a,-1,sizeof(a));
#define FILL(a) memset(a,0x3f,sizeof(a));
#define INF 0x3f3f3f3f
#define LLINF 0x3f3f3f3f3f3f3f3f
#define ll long long
#define print(b,a) cout<<b<<"="<<a<<endl;
#define printbin(b,a){int tmp=a;string s;do{s+=tmp%2+‘0‘;tmp/=2;}while(tmp);reverse(s.begin(),s.end());cout<<"bin "<<b<<"="<<s<<endl;}
#define printarr(i,a,f,b) {For(i,f,b) printf("%d ",a[i]); printf("\n");}

struct node
{
    int x,y;
    bool operator <(const node& rhs) const
    {
        if(x!=rhs.x) return x<rhs.x;
        else return y<rhs.y;
    }
    bool operator ==(const node& rhs) const
    {
        return x==rhs.x&&y==rhs.y;
    }
};
int n,sz;
char mat1[60][60],mat2[60][60],buf[2000];
string s[4];
map<string,int>dic;
map<node,int>isb;
vector<node>b,btmp;
set<string>ans;
node rot(node tmp,int idx){
    int x=tmp.x,y=tmp.y;
    if(idx==0)
        return tmp;
    else if(idx==1)
    {
        return node{y,n+1-x};
    }
    else if(idx==2)
    {
        return node{n+1-x,n+1-y};
    }
    else
    {
        return node{n+1-y,x};
    }
}
string getstr(int idx)
{
    isb.clear();
    btmp.clear();
    btmp=b;
    For(i,0,sz-1)
    {
        btmp[i]=rot(btmp[i],idx);
        //printf("%d %d\n",btmp[i].x,btmp[i].y);
        isb[btmp[i]]=1;
    }
    string ret;
    For(i,1,n)
    {
        For(j,1,n)
        {
            if(isb[node{i,j}]==1)
            {
                //printf("i=%d j=%d\n",i,j);
                ret+=mat1[i][j];
            }
        }
    }
    return ret;

}
string preprocess(string s)///deal with blanks
{
    string ret("");
    int len = s.length();
    bool flag = true;///ignore blank
    int i = 0;
    while(s[i] == ‘.‘)i++;
    for(; i < len; ++i)
    {
        if(s[i] == ‘.‘)
        {
            flag = false;///blank delay!!! only mark it when encounter blank, because you may encounter blanks!!!
        }//the blank after the first word activated the flag
        else//while the second word set the first blank and at the same time eliminated the flag
        {
            if(!flag)
            {
                ret += ‘ ‘;
                flag = true;
            }
            ret += s[i];
        }
    }
    return ret;
}
bool check(string s)
{
    int len = s.length();
    string key;
    for(int i = 0; i < len; ++i)
    {
        if(s[i] == ‘ ‘)
        {
            if(dic.find(key) == dic.end()) return false;
            key.clear();
        }
        else key += s[i];
    }
    if(dic.find(key) == dic.end()) return false;
    return true;
}
int r[4][4] =
{
    {0,1,2,3},
    {1,2,3,0},
    {2,3,0,1},
    {3,0,1,2}
};//circle shift
int main()
{
    freopen("in.txt","r",stdin);
    int T;
    scanf("%d",&T);
    For(kases,1,T)
    {
        scanf("%d",&n); getchar();

        For(i,1,n)
            gets(mat1[i]+1);
        b.clear();
        For(i,1,n) {
            gets(mat2[i]+1);
            For(j,1,n)
            {
                if(mat2[i][j]==‘*‘)
                {
                    b.push_back(node{i,j});
                    //printf("i=%d j=%d\n",i,j);
                }
            }
        }
        sz=b.size();

        int m;
        scanf("%d",&m);
        dic.clear();
        For(i,1,m)
        {
            string tmp;
            cin>>tmp;
            dic[tmp]=1;
        }

        For(i,0,3){
            s[i]=getstr(i);
            //cout<<"i="<<i<<" "<<s[i]<<endl;
        }
        ans.clear();
        for(int i = 0; i < 4; ++i)
        {
             string tocheck("");
             for(int j = 0; j < 4; ++j) tocheck += tostring[r[i][j]];///concatenate string
             string st = preprocess(tocheck);
             if(check(st)) ans.insert(st);
         }
        if(ans.size()!=0)
            cout<<"Case #"<<kases<<": "<<*ans.begin()<<endl;
        else
            cout<<"Case #"<<kases<<": "<<"FAIL TO DECRYPT"<<endl;
    }
    return 0;
}

时间: 2024-10-14 21:39:21

hdu4119 模拟的相关文章

CentOS系统启动及内核大破坏模拟实验

讲过了centos的启动流程,此时是不是想来点破坏呢?那就尽情的玩耍吧,记得在实验之前拍个快照,万一哪个环节错误恢复不回来了呢,毕竟数据无价,话不多说,开始. 一.删除伪系统根.(ramdisk文件) (1)模拟误操作删除ramdisk文件. ①模拟误删除initramfs-3.10.0-514.el7.x86_64.img文件. ②为当前正在使用的内核重新制作ramdisk文件 格式为:mkinitrd /boot/initramfs-$(uname -r).img $(uname -r) (

NYOJ 2356: 哈希计划【模拟】

题目描述 众所周知,LLM的算法之所以菜,就是因为成天打游戏,最近LLM突然想玩<金庸群侠传X>,结果进去后各种被虐,LLM就开始研究这个游戏的代码,顺便还学会了一点点点点lua语言,然后就开始了伟大的改游戏代码之旅,然后LLM发现自己too young了,这个游戏把所有的文本都进行了哈希,如果自己改了代码或者剧情文本的话它哈希出来的值就会和原来的哈希值不一样......然后游戏就会打不开.....,现在LLM发现了文本的哈希函数,要求你写个程序,功能为: 输入一段字符串,输出一个哈希值 为了

爬虫——模拟点击动态页面

动态页面的模拟点击: 以斗鱼直播为例:http://www.douyu.com/directory/all 爬取每页的房间名.直播类型.主播名称.在线人数等数据,然后模拟点击下一页,继续爬取 #!/usr/bin/python3 # -*- conding:utf-8 -*- __author__ = 'mayi' """ 动态页面的模拟点击: 模拟点击斗鱼直播:http://www.douyu.com/directory/all 爬取每页房间名.直播类型.主播名称.在线人数

爬虫——网站模拟登录

使用Selenium与PhantomJS模拟登录豆瓣:https://www.douban.com/ #!/usr/bin/python3 # -*- conding:utf-8 -*- __author__ = 'mayi' """ 模拟登录豆瓣:https://www.douban.com/ """ from selenium import webdriver # 调用环境变量指定的PhantomJS浏览器创建浏览器对象,executable

python爬虫 模拟登陆校园网-初级

最近跟同学学习爬虫的时候看到网上有个帖子,好像是山大校园网不稳定,用py做了个模拟登陆很有趣,于是我走上了一条不归路..... 先上一张校园网截图 首先弄清一下模拟登陆的原理: 1:服务器判定浏览器登录使用浏览器标识,需要模拟登陆 2: 需要post账号,密码,以及学校id python走起,我用的2.7版本,用notepad++写的,绑定python可以直接运行 由于是模拟网页登陆,需要导入urllib urllib2 cookielib库,前两个有与网页直接的接口,cookielib就是用来

Android模拟位置信息

Android模拟位置程序,俗称GPS欺骗,只能修改采用GPS定位的软件. 手机定位方式目前有4种:基站定位,WIFI定位,GPS定位,AGPS定位 常见的修改手法: 1. 抓包欺骗法,抓包改包欺骗服务器端, 但是得专门去针对某款app,而且现在很多app数据包都加密了 2. hook java层经纬度获取函数, 这个方法以前可以用,现在不行了 3. hook native层经纬度获取函数 4. 使用允许模拟地址位置信息(不是很通用有版本限制) 为了修改微信朋友圈地理位置信息,为了好玩 试过了上

CSU 1112: 机器人的指令【模拟题】

1112: 机器人的指令 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 1858  Solved: 682 [Submit][Status][Web Board] Description 数轴原点有一个机器人.该机器人将执行一系列指令,你的任务是预测所有指令执行完毕之后它的位置. ·LEFT:往左移动一个单位 ·RIGHT: 往右移动一个单位 ·SAME AS i: 和第i 条执行相同的动作.输入保证i 是一个正整数,且不超过之前执行指令数 In

Regionals 2015 &gt;&gt; Europe - Central &gt;&gt;7325 - Book Borders【模拟】

Europe - Central >>7325 - Book Borders 题目链接:7325 题目大意:给你一个字符串(含空格),每行x个字符,将单词排列进去,单词不能断开,问每行第一个单词的长度时多少,注意加空格 题目思路:直接模拟.第一个for遍历[a,b],第二个大致为n/a.复杂度大概为nlogn. 开两个数组,v[i]记录i这个位置所属的单词开始位置,e[v[i]]记录第i个位置所属的单词的结束位置. 然后每次判断这一行结尾,所在位置.如果在两个单词中间,则将该单词视为下一行开始

GNS 3模拟防火墙ASA

[模拟环境] 所使用的GNS3版本为0.7.4,如果低于这个版本,有些版本会缺少些选项无法支持. [ASA]     ASA有2种模式的编译文件,分别为单模式和多模式,可选择使用.我使用的是单模式,我试用过多模式,不太好用. [配置] 打开GNS3,编辑→首选项→Qemu→ASA:     添加单模式:Identifier name:asa802-k8-sing(自己填名称,但不能是中文)RAM:256(使用默认的256)Number of NICs:6(网卡数量,默认是6)NIC model: