校内测试-密码破解

题目:

主要算法 :  字符串(模式匹配)

题干:

    文章翻译

应试策略:  

  1.   刚开始认为规则是样例。结果发现样例是错误的,有‘y’没有按照规则修改
  2.   最后问了格式,对于一篇文章如果有一个长度为1的单词,那么就只有‘I’与‘a’这两种情况,因为a比较容易判断,只需要前面和后面是空格就行,这样贪心得了100分,其它打正解的还没有我跑得快,但是如果不存在冠词a的情况,就WA了

代码

#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#define FORa(i,s,e) for(int i=s;i<=e;i++)
#define FORs(i,s,e) for(int i=s;i>=e;i--)
#define File(name) freopen(name".in","r",stdin);freopen(name".out","w",stdout);
#define gc pa==pb&&(pb=(pa=buf)+fread(buf,1,100000,stdin),stdin)?EOF:*pa++

using namespace std;
inline int read();
char buf[100000],*pa,*pb;
string s;
int cnt=1;
int len;

int main()
{
    File("whos");
    getline(cin,s),len=s.size();
    string fs=" ";
    int sp=s.find(fs,0);
    while(sp!=-1)
    {
        if(s[sp+1]>='a'&&s[sp+1]<='z'&&s[sp+2]==' ')
        {
            cnt=s[sp+1]-'a';
            break;
        }
        sp++;
        sp=s.find(fs,sp);
    }
    for(int i=0;i<len;i++)
    {
        if(s[i]>='a'&&s[i]<='z')
        {
             if(s[i]-cnt<'a') s[i]+=26;
            printf("%c",s[i]-cnt);
        }
        else if(s[i]>='A'&&s[i]<='Z')
        {
            if(s[i]-cnt<'A') s[i]+=26;
            printf("%c",s[i]-cnt);
        }
        else printf("%c",s[i]);
    }    
    return 0;
}
inline int read()
{
    register int x(0),f(1);register char c(gc);
    while(c<'0'||c>'9') f=c=='-'?-1:1,c=gc;
    while(c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=gc;
    return x*f;
}

非完美算法:  

    模拟

 正解:

  1.   先看题哈
  2.   找出出现频率最大的字母,然后与E之间制定规则,将所有字母按照规则输出

总结:

  1.   能不能先看题

原文地址:https://www.cnblogs.com/SeanOcean/p/11309899.html