bestcoder百度之星2016AK 1001&1002&1003&1004 題解

1001、


分析:迷迷糊糊做了出來,其實關於逆元,我一直是懵圈的。。。淚奔,多方詢問各位大神,下次等我徹底理解逆元的相關問題,再來詳細解釋


#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <cmath>
#include <cstdlib>
#include <map>
#include <vector>

using namespace std;

#define N 221000
const int MOD = 9973;
#define met(a, b) memset(a, b, sizeof(a))

typedef long long LL;

char str[N];
int sum[N];

int Quick_Pow (int m, int n)
{
    int b = 1;
    while (n)
    {
        if (n&1)
            b = (b*m%MOD) % MOD;
        m = (m*m%MOD)%MOD;
        n /= 2;
    }
    return b;
}

int main ()
{
    int n, ans, tt;
    while (scanf ("%d", &n) != EOF)
    {
        scanf ("%s", str+1);

        sum[0] = 1;

        for (int i=1; str[i]; i++)
            sum[i] = (sum[i-1]*(str[i]-28)%MOD)%MOD;

        while (n--)
        {
            int sa, en;

            scanf ("%d %d", &sa, &en);

             tt = Quick_Pow (sum[sa-1], MOD-2);
             ans = (sum[en] * tt % MOD) % MOD;

            printf ("%d\n", ans);
        }
    }
    return 0;
}


1002、

分析:斐波那契數列的應用,但是數據太大,可以用大數模板解決,(一言不合就達打表),速度最快的方法,先求出來斐波那契數列的前200項,打一個表,之後O(n)線性時間解決


#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

int main()
{
    int n;
    char str[205][500]={ "1" , "2" , "3" , "5" , "8" , "13" , "21" , "34" , "55" , "89" , "144" , "233" , "377" , "610" , "987" , "1597" , "2584" , "4181" , "6765" , "10946" , "17711" , "28657" , "46368" , "75025" , "121393" , "196418" , "317811" , "514229" , "832040" , "1346269" , "2178309" , "3524578" , "5702887" , "9227465" , "14930352" , "24157817" , "39088169" , "63245986" , "102334155" , "165580141" , "267914296" , "433494437" , "701408733" , "1134903170" , "1836311903" , "2971215073" , "4807526976" , "7778742049" , "12586269025" , "20365011074" , "32951280099" , "53316291173" , "86267571272" , "139583862445" , "225851433717" , "365435296162" , "591286729879" , "956722026041" , "1548008755920" , "2504730781961" , "4052739537881" , "6557470319842" , "10610209857723" , "17167680177565" , "27777890035288" , "44945570212853" , "72723460248141" , "117669030460994" , "190392490709135" , "308061521170129" , "498454011879264" , "806515533049393" , "1304969544928657" , "2111485077978050" , "3416454622906707" , "5527939700884757" , "8944394323791464" , "14472334024676221" , "23416728348467685" , "37889062373143906" , "61305790721611591" , "99194853094755497" , "160500643816367088" , "259695496911122585" , "420196140727489673" , "679891637638612258" , "1100087778366101931" , "1779979416004714189" , "2880067194370816120" , "4660046610375530309" , "7540113804746346429" , "12200160415121876738" , "19740274219868223167" , "31940434634990099905" , "51680708854858323072" , "83621143489848422977" , "135301852344706746049" , "218922995834555169026" , "354224848179261915075" , "573147844013817084101" , "927372692193078999176" , "1500520536206896083277" , "2427893228399975082453" , "3928413764606871165730" , "6356306993006846248183" , "10284720757613717413913" , "16641027750620563662096" , "26925748508234281076009" , "43566776258854844738105" , "70492524767089125814114" , "114059301025943970552219" , "184551825793033096366333" , "298611126818977066918552" , "483162952612010163284885" , "781774079430987230203437" , "1264937032042997393488322" , "2046711111473984623691759" , "3311648143516982017180081" , "5358359254990966640871840" , "8670007398507948658051921" , "14028366653498915298923761" , "22698374052006863956975682" , "36726740705505779255899443" , "59425114757512643212875125" , "96151855463018422468774568" , "155576970220531065681649693" , "251728825683549488150424261" , "407305795904080553832073954" , "659034621587630041982498215" , "1066340417491710595814572169" , "1725375039079340637797070384" , "2791715456571051233611642553" , "4517090495650391871408712937" , "7308805952221443105020355490" , "11825896447871834976429068427" , "19134702400093278081449423917" , "30960598847965113057878492344" , "50095301248058391139327916261" , "81055900096023504197206408605" , "131151201344081895336534324866" , "212207101440105399533740733471" , "343358302784187294870275058337" , "555565404224292694404015791808" , "898923707008479989274290850145" , "1454489111232772683678306641953" , "2353412818241252672952597492098" , "3807901929474025356630904134051" , "6161314747715278029583501626149" , "9969216677189303386214405760200" , "16130531424904581415797907386349" , "26099748102093884802012313146549" , "42230279526998466217810220532898" , "68330027629092351019822533679447" , "110560307156090817237632754212345" , "178890334785183168257455287891792" , "289450641941273985495088042104137" , "468340976726457153752543329995929" , "757791618667731139247631372100066" , "1226132595394188293000174702095995" , "1983924214061919432247806074196061" , "3210056809456107725247980776292056" , "5193981023518027157495786850488117" , "8404037832974134882743767626780173" , "13598018856492162040239554477268290" , "22002056689466296922983322104048463" , "35600075545958458963222876581316753" , "57602132235424755886206198685365216" , "93202207781383214849429075266681969" , "150804340016807970735635273952047185" , "244006547798191185585064349218729154" , "394810887814999156320699623170776339" , "638817435613190341905763972389505493" , "1033628323428189498226463595560281832" , "1672445759041379840132227567949787325" , "2706074082469569338358691163510069157" , "4378519841510949178490918731459856482" , "7084593923980518516849609894969925639" , "11463113765491467695340528626429782121" , "18547707689471986212190138521399707760" , "30010821454963453907530667147829489881" , "48558529144435440119720805669229197641" , "78569350599398894027251472817058687522" , "127127879743834334146972278486287885163" , "205697230343233228174223751303346572685" , "332825110087067562321196029789634457848" , "538522340430300790495419781092981030533" , "871347450517368352816615810882615488381" , "1409869790947669143312035591975596518914" , "2281217241465037496128651402858212007295" , "3691087032412706639440686994833808526209" , "5972304273877744135569338397692020533504" , "9663391306290450775010025392525829059713" , "15635695580168194910579363790217849593217" , "25299086886458645685589389182743678652930" , "40934782466626840596168752972961528246147" , "66233869353085486281758142155705206899077" , "107168651819712326877926895128666735145224" , "173402521172797813159685037284371942044301" , "280571172992510140037611932413038677189525" , "453973694165307953197296969697410619233826"};
    while (scanf("%d",&n) == 1)
    {
        printf("%s\n",str[n-1]);
    }
    return 0;
}


1003、


分析:裸的字典樹,難度在於刪除某一棵子樹。。。水題,WA7次,呵呵一笑


#include <cstdio>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

struct TrieNode
{
    int vis;
    struct TrieNode *next[26];
};

typedef TrieNode Trie;

Trie * CreateNode()
{
    Trie *p=(Trie *)malloc(sizeof(Trie));
    for (int i=0;i<26;i++)
        p->next[i]=NULL;
    p->vis=0;
    return p;
}

Trie *root;
void Insert(char* str)
{
    Trie *p=root;
    p->vis=true;
    int len=strlen(str);
    for (int i=0;i<len;i++)
    {
        int id=str[i]-'a';
        if (p->next[id] == NULL)
        {
            p->next[id]=CreateNode();
            p=p->next[id];
            p->vis++;
        }
        else{
            p=p->next[id];
            p->vis++;
        }
    }
}

int Search(char* str)
{
    Trie *p=root;
    int len=strlen(str);
    for (int i=0;i<len;i++)
    {
        int id=str[i]-'a';
        if (p->next[id] == NULL) return 0;
        else p=p->next[id];
    }
    return p->vis;
}

/*
void Del(char* str)
{
    bool f=Search(str);
    if (f == false)  return;
    else
    {
        Trie *p=root;
        int len=strlen(str);
        for (int i=0;i<len;i++)
        {
            int id=str[i]-'a';
            p=p->next[id];
            p->vis=false;
        }
    }
}*/

void Del(char* str)
{
    int cnt=Search(str);
    if (cnt == 0)  return;
    else
    {
        Trie *p=root;
        int len=strlen(str);
        for (int i=0;i<len;i++)
        {
            int id=str[i]-'a';
            p=p->next[id];
            p->vis-=cnt;
        }
        for (int i=0;i<26;i++) p->next[i]=NULL;
    }
}

int main()
{
    int t;
    scanf("%d",&t);
   // getchar();
    root=CreateNode();
    while (t--)
    {
        char str1[7],str2[45];
        scanf("%s%s",str1,str2);
        switch(str1[0])
        {
        case 'i':
            Insert(str2);
            break;
        case 's':
            printf("%s\n",Search(str2)>0?"Yes":"No");
            break;
        case 'd':
            Del(str2);
        }
    }
    return 0;
}


1004、


分析:先標準化,都讓字符串從小到大排序,這樣考慮的情況就減少了很多,開始我的想法用map容器處理,TLE。。。無語,不知道爲什麼最近用map總是超時鬧bug。。。鬱悶;之後換個方向思考,字典樹(具體可以見我前面的博客),裸的字典樹,只需處理插入查找便可


#include <cstdio>
#include <string>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>

using namespace std;


struct TrieNode
{
    bool vis;
    struct TrieNode *next[26];
    int id;
};

typedef TrieNode Trie;

Trie *root;

Trie *CreateNode()
{
    Trie *p=(Trie*)malloc(sizeof(Trie));
    p->vis=false;
    p->id=0;
    for (int i=0;i<26;i++)
        p->next[i]=NULL;
    return p;
}

void Insert(string str)
{
    Trie *p=root;
    int len=str.size();
    for (int i=0;i<len;i++)
    {
        str[i]=tolower(str[i]);
        int id=str[i]-'a';
        if (p->next[id] == NULL)
        {
            p->next[id]=CreateNode();
            p=p->next[id];
        }
        else p=p->next[id];
    }
    p->id=1;
    p->vis=true;
}
int Search(string str)
{
    Trie *p=root;
    int len=str.size();
    for (int i=0;i<len;i++)
    {
        str[i]=tolower(str[i]);
        int id=str[i]-'a';
        p=p->next[id];
        if (p == NULL) return 0;
    }
    if (p->vis == true) {p->id++;return p->id-1;}
    else return 0;
}

int main()
{
    int t;
    scanf("%d",&t);
    getchar();
    root=CreateNode();
    for (int i=1;i<=t;i++)
    {
        string str;
        cin>>str;
        sort(str.begin(),str.end());
        if (i == 1){Insert(str);printf("0\n");}
        else {
            int s=Search(str);
            if (!s) {Insert(str);printf("0\n");}
            else printf("%d\n",s);
        }
    }
    return 0;
}


1005、大神代碼

#include <cstdio>
#include <cstring>
#include <cmath>
#include <map>
#include <set>
#include <iostream>
#include <algorithm>
#include <queue>
#include <string>
#include <stack>
#define CLR(a, b) memset(a, b, sizeof(a))
using namespace std;
typedef long long LL;
typedef pair<int, int> pii;
const int MAXN = 3 * 1e6 + 10;
const int MOD = 9973;
const int INF = 0x3f3f3f3f;
struct Node {
    char var[20];
    int digit, op;
};
Node num[1010][40];
int cnt[1010];
void Solve(char *s, int id) {
    int top = 0; cnt[id] = 0; num[id][cnt[id]].op = 0;
    int len = strlen(s), mark = 0, sum = 0, sign = 1;
    s[len] = ',';
    for(int i = 0; i <= len; i++) {
        if(s[i] == ',') {
            num[id][cnt[id]].digit = sum * sign;
            cnt[id]++; top = mark = 0;
            num[id][cnt[id]].op = 0;
            sum = 0; sign = 1;
        }
        else if(s[i] == ' ') {
            if(s[i+1] != ' ') {
                if(mark == 1) {
                    num[id][cnt[id]].var[top] = 0;
                }
            }
        }
        else if(s[i] == '>') {
            mark = 2;
            num[id][cnt[id]].op = 1;
        }
        else if(s[i] == '<') {
            mark = 2;
            num[id][cnt[id]].op = 2;
        }
        else if(s[i] == '=') {
            mark = 2;
            num[id][cnt[id]].op += 3;
        }
        else if(s[i] == '-' || (s[i] >= '0' && s[i] <= '9')) {
            mark = 3;
            if(s[i] == '-') {
                sign = -1;
                continue;
            }
            sum = sum * 10 + (s[i] - '0');
        }
        else {
            mark = 1;
            num[id][cnt[id]].var[top++] = s[i];
        }
    }
}
// > 1 < 2 = 3 >= 4 <= 5 == 6
bool Check(int op1, int v1, int op2, int v2) {
    if(op1 == 1) {
        if(op2 == 2 && v2 <= v1 + 1) {
            return false;
        }
        if(op2 == 5 || op2 == 6) {
            if(v2 <= v1) {
                return false;
            }
        }
    }
    if(op1 == 2) {
        if(op2 == 1 && v2 >= v1 + 1) {
            return false;
        }
        if(op2 == 4 || op2 == 6) {
            if(v2 >= v1) return false;
        }
    }
    if(op1 == 4) {
        if(op2 == 2 && v2 <= v1) {
            return false;
        }
        if(op2 == 5 || op2 == 6) {
            if(v2 < v1) {
                return false;
            }
        }
    }
    if(op1 == 5) {
        if(op2 == 1 && v2 >= v1) {
            return false;
        }
        if(op2 == 4 || op2 == 6) {
            if(v2 > v1) return false;
        }
    }
    if(op1 == 6) {
        if(op2 == 1 && v2 >= v1) {
            return false;
        }
        if(op2 == 2 && v2 <= v1) {
            return false;
        }
        if(op2 == 4 && v2 > v1) {
            return false;
        }
        if(op2 == 5 && v2 < v1) {
            return false;
        }
        if(op2 == 6 && v2 != v1) {
            return false;
        }
    }
    return true;
}
bool judge(int x, int y) {
    for(int i = 0; i < cnt[x]; i++) {
        for(int j = 0; j < cnt[y]; j++) {
            if(strcmp(num[x][i].var, num[y][j].var) == 0) {
                if(!Check(num[x][i].op, num[x][i].digit, num[y][j].op, num[y][j].digit)) {
                    return false;
                }
            }
        }
    }
    return true;
}
char str[101000];
int rec[1010];
bool vis[1010];
int main()
{
    int n;
    while(scanf("%d", &n) != EOF) {
        getchar();
        for(int i = 1; i <= n; i++) {
            gets(str); Solve(str, i);
//            for(int j = 0; j < cnt[i]; j++) {
//                printf("%s %d %d\n", num[i][j].var, num[i][j].op, num[i][j].digit);
//            }
            vis[i] = judge(i, i);
            if(vis[i] == false) {
                printf("unique\n");
                continue;
            }
            int m = 0; bool flag = false;
            for(int j = 1; j < i; j++) {
                if(vis[j] == false) continue;
                if(judge(i, j)) {
                    rec[++m] = j;
                    flag = true;
                }
            }
            if(!flag) {
                printf("unique\n");
            }
            else {
                for(int j = 1; j <= m; j++) {
                    if(j > 1) printf(" ");
                    printf("%d", rec[j]);
                }
                printf("\n");
            }
        }
    }
    return 0;
}

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