[NOIP2017模擬]抄代碼

2017.10.26 T1 2010

樣例數據
輸入

5
int x;
int y;
double a;
double aa;
float 1
float 2
string s;
double d;
print thisismycode;
float tooooooooooo;

輸出

1
0
0
1
1

分析:這真是一道一波三折的題。考場上看到這道題,哇,掃一遍就可以的暴力誒,秒掉(其實沒有“秒掉”,我對字符串不太熟,還是很小心的)。考完之後,喫飯的時候討論到這道題,高老師道出了題面的坑,“每一次操作”,也就意味着每次操作只能改一種字母,而我的理解是一次性所有的字母都改成對應的字母。
舉個例子:

abcdefghijklmnopqrstuvwxyz
zyxwvutsrqponmlkjihgfedcba

以我的理解,每種字母都能唯一對應另一種字母,所以是抄襲的。但是,按題面的意思,一次只能改一種字母,比如,先把a改成了z,現在想把z改成a時就會把之前a改成的字母z給改回去,所以抄襲是做不到的。
聽完這種解釋我真是心灰意冷,但是拿到題解的時候,我又欣喜地發現題解的意思和我的理解是一致的(看來出題人自己出題出鍋了)。之後看到成績發現我只有60……然後發現我的程序有bug,把自己繞進去了……以後分情況要考慮完整,如果想到了原串長度大於抄襲長度的話應該立即想到抄襲長度大於原串(我就是漏了)。

代碼
不要學我這麼一個一個比較,太多判斷會把自己繞進去(不止一次了orz)

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<ctime>
#include<cmath>
#include<algorithm>
#include<cctype>
#include<iomanip>
#include<queue>
#include<set>
using namespace std;

int getint()
{
    int sum=0,f=1;
    char ch;
    for(ch=getchar();!isdigit(ch)&&ch!='-';ch=getchar());
    if(ch=='-')
    {
        f=-1;
        ch=getchar();
    }
    for(;isdigit(ch);ch=getchar())
        sum=(sum<<3)+(sum<<1)+ch-48;
    return sum*f;
}

int T,cnt,cnt2;
char j[1010],mtch[30];
bool bj;

int main()
{
    freopen("copycat.in","r",stdin);
    freopen("copycat.out","w",stdout);

    char ch;
    T=getint();
    while(T--)
    {
        memset(mtch,0,sizeof(mtch));
        cnt=0,cnt2=0,bj=0;
        ch=getchar();
        while(ch!='\n')
        {
            cnt++;
            j[cnt]=ch;
            ch=getchar();
        }

        ch=getchar();
        while(ch!='\n'&&ch!=EOF)
        {
            cnt2++;
            if(bj==0)
            {
                if(cnt2>cnt)
                {
                    cout<<0<<'\n';
                    bj=1;
                }
                else if(((ch<'a'||ch>'z')&&(j[cnt2]<'a'||j[cnt2]>'z')&&ch!=j[cnt2])||((ch>='a'&&ch<='z')&&(j[cnt2]<'a'||j[cnt2]>'z'))||((ch<'a'||ch>'z')&&(j[cnt2]>='a'&&j[cnt2]<='z')))
                {
                    cout<<0<<'\n';
                    bj=1;
                }
                else
                {
                    if(ch>='a'&&ch<='z')
                        if(!mtch[j[cnt2]-'a'])
                            mtch[j[cnt2]-'a']=ch;
                        else
                            if(ch!=mtch[j[cnt2]-'a'])
                            {
                                cout<<0<<'\n';
                                bj=1;
                            }
                }
                ch=getchar();
            }
            else
                ch=getchar();
        }

        if(bj==0)
        {
            if(cnt2<cnt)//抄襲串本身就小於原串的話在上面是判不了的
                cout<<0<<'\n';
            else
                cout<<1<<'\n';
        }

    }
    return 0;
}

可以學學這種整體處理法,多麼簡單誒,我爲什麼偏偏要寫那麼繞呢orz

#include<iostream>
#include<cstring>
#include<string>
#include<cstdlib>
#include<cstdio>
#include<ctime>
#include<cmath>
#include<cctype>
#include<iomanip>
#include<algorithm>
using namespace std;

int t,lens,lent,num[100];
char s[2000],st[2000];

int readint()
{
    char ch;int i=0,f=1;
    for(ch=getchar();(ch<'0'||ch>'9')&&ch!='-';ch=getchar());
    if(ch=='-') {ch=getchar();f=-1;}
    for(;ch>='0'&&ch<='9';ch=getchar()) i=(i<<3)+(i<<1)+ch-'0';
    return i*f;
}

bool check()
{
    if(lens!=lent) return false;//長度不同直接false
    for(int i=1;i<=lens;i++)
        if(s[i]>='a'&&s[i]<='z'&&st[i]>='a'&&st[i]<='z')//字母情況
        {
            if(num[s[i]-'a'])//如果前面已經記錄了這種字母對應的字母
            {
                if(num[s[i]-'a']!=st[i]-'a')
                    return false;
            }
            else
                num[s[i]-'a']=st[i]-'a';
        }
        else if(s[i]!=st[i]) return false;//非字母情況
    return true;
}

int main()
{
    freopen("copycat.in","r",stdin);
    freopen("copycat.out","w",stdout);

    t=readint();
    while(t--)
    {
        memset(num,0,sizeof(num));
        lens=0;lent=0;
        do {s[++lens]=getchar();}
        while(s[lens]!='\n');//把兩個串都先讀完
        do {st[++lent]=getchar();}
        while(st[lent]!='\n'&&st[lent]!=EOF);
        lens--;lent--;
        if(check()==true) printf("1\n");
        else printf("0\n");
    }

    return 0;
}

本題結。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章