• 【百度之星


    1001.Problem A

    http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?cid=690&pid=1001

      类似倒水原理,但是这里是连乘,对于连续累积S。 x = S[a...b] = S[b] % 9973 / S[a - 1] % 9973。 也就是求

    a * x = b %9973 线性方程组的解。EXGCD拓展GCD求解。数论题。

    Promble B

      斐波那契数列。可以大整数,可以java。我贴下Java代码,好久没用了。

    import java.math.*;
    import java.io.*;
    import java.text.*;
    import java.util.Scanner;
    
    public class Main {
        public static void main(String []args){ 
            Scanner cin = new Scanner(System.in);
            while(cin.hasNext()){
                BigInteger r = cin.nextBigInteger();
                BigInteger bigTwo = new BigInteger("2");
                BigInteger m = BigInteger.ZERO;
                BigInteger n = BigInteger.ZERO;
                BigInteger ret = BigInteger.ZERO;
                while(m.compareTo(r.divide(bigTwo)) <= 0){
                    n = r.subtract(m);
                    BigInteger fz = BigInteger.ONE;
                    BigInteger fm = BigInteger.ONE;
                    BigInteger left = (n.subtract(m)).add(BigInteger.ONE);
                    BigInteger right = n;
                    while(left.compareTo(right) <= 0){
                        fz = fz.multiply(left);
                        left = left.add(BigInteger.ONE);
                    }
                    left = m;
                    while(left.compareTo(BigInteger.ONE) >= 0){
                        fm = fm.multiply(left);
                        left = left.subtract(BigInteger.ONE);
                    }
                    ret = ret.add(fz.divide(fm));
                    m = m.add(BigInteger.ONE);
                }
                System.out.println(ret);
            }
        }
    }

    Problem C

      字典树。贴一下自己敲的Trie,下次没准用得上。

    #include <iostream>
    #include <cmath>
    #include <cstring>
    #include <map>
    #include <set>
    #include <algorithm>
    using namespace std;
    
    const int Max = 26;
    class TrieNode {
    public:
        int num;
        TrieNode *next[Max];
        TrieNode() {
            memset(next, NULL, sizeof next);
            num = 0;
        }
    };
    class Trie {
    public:
        
        Trie() {
            root = new TrieNode();
        }
        ~Trie(){
            free(root);
        }
        // Inserts a word into the trie.
        void insert(char* word) {
            TrieNode* p = root;
            int len = strlen(word);
            for(int i = 0; i < len; i ++){
                int id = word[i] - 'a';
                if(p->next[id] == NULL)
                    p->next[id] = new TrieNode();
                p = p->next[id];
                p->num ++;
            }
        }
        // Returns if the word is in the trie.
        TrieNode* search(char* word) {
            TrieNode *p = root;
            int len = strlen(word);
            for(int i = 0; i < len; i ++){
                int id = word[i] - 'a';
                if(p->next[id] == NULL) return NULL;
                else{
                    p = p->next[id];
                }
            }
            return p;
        }
    
        void destoryWord(TrieNode* p)
        {
            if(!p) return ;
            for(int i = 0; i < Max; i ++ ){
                destoryWord(p -> next[i]);
            }
            free(p);
        }
    
        void destorySon(TrieNode * p)
        {
            if(!p) return;
            for(int i = 0; i < Max; i ++ ){
                destoryWord(p -> next[i]);
                p->next[i] = NULL;
            }
        }
    
        void deleteWord(char* word)
        {
            TrieNode *cur = search(word);
            if(!cur) return ;
            int count = cur -> num;
            destorySon(cur);
            TrieNode *p = root;
            int len = strlen(word);
            for(int i = 0; i < len; i ++){
                int id = word[i] - 'a';
                p = p -> next[id];
                p -> num -= count;
            }
        }
    
    private:
        TrieNode* root;
    };
    
    int main()
    {
        int n;
        Trie trie;
        scanf("%d",&n);
        getchar();
        char op[10], str[50];
        while(n -- ){
            scanf("%s%s",op, str);
            if(op[0] == 'i'){
                trie.insert(str);
            }else if(op[0] == 'd'){
                trie.deleteWord(str);
            }else {
                TrieNode *rec = trie.search(str);
                if(rec && rec -> num > 0) printf("Yes
    ");
                else printf("No
    ");
            }
        }system("pause");
        return 0;
    }
    /*
    11
    insert aaaa
    insert aaab
    insert aab
    insert aac
    insert ab
    search aaa
    delete aaa
    search aaa
    search aaab
    search aa
    search ab
    */

    1004.Problem D

      字符串hash。一开始用Map<string, int>tle。我还以为是string输入效率不行,改成字典树用char* 输入过得,但之后有看到人家用map哈希过得,我也是很郁闷啊。

  • 相关阅读:
    JavaFx初探
    TraceView总结
    sprintf,你知道多少?
    C/C++:多个.cpp文件包括同一个.h头文件定义方法
    Android中Preference的使用以及监听事件分析
    Android系统默认Home应用程序(Launcher)的启动过程源码分析
    升级、备份红帽PaaS openshift 上的 wordpress
    几种开源分词工具的比較
    设计模式奠基石——UML关系转化为代码
    Windows 7系统安装MySQL5.5.21图解
  • 原文地址:https://www.cnblogs.com/luntai/p/5494876.html
Copyright © 2020-2023  润新知