位置:首页 » 技术 » 应用倍增法后缀数组以及RMQ求解N个字符串最长公共子串有关问题

应用倍增法后缀数组以及RMQ求解N个字符串最长公共子串有关问题

日期:2013-11-01 阅读:0num
Advertisement

应用倍增法后缀数组以及RMQ求解N个字符串最长公共子串问题

/**
 * @see IOI2009国家集训队论文《后缀数组——处理字符串的有力工具》
 * @author leon
 *
 */
public class SuffixArray {
    int max_char = '\uffff';

    char separator = '$';

    char eof = '#';

    int[][] rmq;

    String text = "";

    int min_len = Integer.MAX_VALUE;

    int lcs = 0;

    int index = -1;

    private void countingSort(Struct[] in, Struct[] out, int max, int compare_index) {
        int[] temp = new int[max + 1];
        for (int i = 0; i < in.length; i++) {
            temp[in[i].compareAry[compare_index]]++;
        }
        for (int i = 1; i < temp.length; i++) {
            temp[i] += temp[i - 1];
        }
        for (int i = in.length - 1; i >= 0; i--) {
            out[--temp[in[i].compareAry[compare_index]]] = in[i];
        }
    }

    /**
     * Doubling Algorithm
     *
     * @param text
     * @return
     */
    public Suffix buildSuffixArray(String text) {
        Struct[] in = new Struct[text.length()];
        for (int i = 0; i < in.length; i++) {
            in[i] = new Struct(i, new int[] { 0, text.charAt(i) });
        }
        Struct[] aux = (Struct[]) in.clone();
        countingSort(aux, in, max_char, 1);
        int[] rank = new int[in.length];
        int len = text.length();
        int wid = 1;
        Struct[] temp = new Struct[len];
        while (wid < len) {
            rank[in[0].suffix_i] = 0;
            for (int i = 1; i < len; i++) {
                rank[in[i].suffix_i] = rank[in[i - 1].suffix_i];
                if (in[i - 1].compareTo(in[i]) < 0) {
                    rank[in[i].suffix_i]++;
                }
            }
            for (int i = 0; i < len; i++) {
                in[i].suffix_i = i;
                in[i].compareAry[0] = rank[i];
                in[i].compareAry[1] = i + wid < len ? rank[i + wid] : 0;
            }
            countingSort(in, temp, len, 1);
            countingSort(temp, in, len, 0);
            wid *= 2;
        }
        int[] sa = new int[rank.length];
        for (int i = 0; i < rank.length; i++) {
            sa[rank[i]] = i;
        }
        Suffix rs = new Suffix();
        rs.text = text;
        rs.rank = rank;
        rs.sa = sa;
        rs.h = calH(rank, sa, text.toCharArray());
        rs.height = calHeight(rs.h, sa);
        return rs;
    }

    private int[] calHeight(int[] h, int[] sa) {
        int[] height = new int[h.length];
        for (int i = 0; i < height.length; i++) {
            height[i] = h[sa[i]];
        }
        return height;
    }

    private int[] calH(int[] rank, int[] sa, char[] text) {
        int[] h = new int[rank.length];
        if (rank[0] == 0) {
            h[0] = 0;
        } else {
            h[0] = getH(text, 0, sa[rank[0] - 1]);
        }

        for (int i = 1; i < h.length; i++) {
            if (rank[i] == 0) {
                h[i] = 0;
            } else {
                if (h[i - 1] <= 1) {
                    h[i] = getH(text, i, sa[rank[i] - 1]);
                } else {
                    h[i] = h[i - 1] - 1 + getH(text, i + h[i - 1] - 1, sa[rank[i] - 1] + h[i - 1] - 1);
                }
            }
        }
        return h;
    }

    private int getH(char[] text, int i, int j) {
        int len = 0;
        while (i < text.length && j < text.length) {
            if (text[i] == text[j] && text[i] != separator && text[j] != separator) {
                i++;
                j++;
                len++;
            } else {
                break;
            }
        }
        return len;
    }

    public int inquireRMQ(int u, int v, int[] height) {
        if (u > v) {
            int temp = u;
            u = v;
            v = temp;
        }
        if (u == v)
            return height[u];
        int k = (int) (Math.log(1.0 * (v - u + 1)) / Math.log(2.0));
        if (rmq[u][k] < rmq[v - (1 << k) + 1][k])
            return rmq[u][k];
        else
            return rmq[v - (1 << k) + 1][k];
    }

    public void buildRMQ(int[] height) {
        int n = height.length;
        rmq = new int[n][n];
        for (int i = 1; i < height.length; i++)
            rmq[i][0] = height[i];
        for (int j = 1; (1 << j) < n; j++) {
            for (int i = 1; i < n; i++) {
                rmq[i][j] = rmq[i][j - 1];
                if (i + (1 << (j - 1)) < n) {
                    if (rmq[i][j] > rmq[i + (1 << (j - 1))][j - 1]) {
                        rmq[i][j] = rmq[i + (1 << (j - 1))][j - 1];
                    }
                }
            }
        }
    }

    private int[] getRange(String[] texts) {
        int len = 0;

        for (int i = 0; i < texts.length; i++) {
            if (min_len > texts[i].length()) {
                min_len = texts[i].length();
            }
            text += texts[i];
            text += separator;
        }
        text += eof;
        len = text.length();
        int[] ary = new int[len];
        int j = 0;
        int k = 0;
        for (int i = 0; i < texts.length; i++) {
            int offset = texts[i].length() + 1;
            k += offset;
            while (j < k) {
                ary[j] = i;
                j++;
            }
        }
        return ary;
    }

    private void binarySearch(int[] height, int[] sa, int[] range, int n) {
        int low = 0;
        int high = min_len;
        while (low <= high) {
            int mid = (low + high) >> 1;
            if (checkMid(mid, height, sa, range, n)) {
                low = mid + 1;
            } else {
                high = mid - 1;
            }
        }
    }

    private boolean checkMid(int mid, int[] height, int[] sa, int[] range, int n) {
        for (int i = 2; i < height.length; i++) {
            for (int j = i + n - 2; j < height.length; j++) {
                if (inquireRMQ(i, j, height) >= mid) {
                    int sa_from = i - 1;
                    int sa_to = j;
                    if (inRange(range, sa, sa_from, sa_to, n)) {
                        lcs = mid;
                        index = sa[sa_from];
                        return true;
                    }
                } else {
                    break;
                }
            }
        }
        return false;
    }

    private boolean checkMid_old(int mid, int[] height, int[] sa, int[] range, int n) {
        int count = 1;
        for (int i = 2; i < height.length; i++) {
            int j = i;
            while (j < height.length && height[j] >= mid) {
                count++;
                j++;
            }
            if (count < n) {
                count = 1;
            } else {
                int sa_from = i - 1;
                int sa_to = j;
                if (inRange(range, sa, sa_from, sa_to, n)) {
                    lcs = mid;
                    index = sa[sa_from];
                    return true;
                }

                count = 1;
            }
        }
        return false;
    }

    public String lcs(String[] texts) {
        int[] range = getRange(texts);
        Suffix suffix = buildSuffixArray(text);
        buildRMQ(suffix.height);
        binarySearch(suffix.height, suffix.sa, range, texts.length);
        if (lcs == 0) {
            return "EOF";
        }
        return text.substring(index, index + lcs);
    }

    public boolean inRange(int[] range, int[] sa, int sa_from, int sa_to, int n) {
        boolean[] visit = new boolean[n];
        int count = 0;
        for (int i = sa_from; i <= sa_to; i++) {
            if (!visit[range[sa[i]]]) {
                visit[range[sa[i]]] = true;
                count++;
            }
        }
        if (count == n) {
            return true;
        }
        return false;
    }

    public static void main(String[] args) {
        SuffixArray sa = new SuffixArray();
        String s = sa.lcs(new String[] { "adcccbadbbcadcccbba", "aabbccaacccabcca", "abccabccaccc", "e" });
        System.out.println(s);
    }
}

class Suffix {
    public String text;

    public int[] rank;

    public int[] sa;

    public int[] h;

    public int[] height;
}

class Struct implements Comparable<Struct> {
    public int suffix_i;

    public int[] compareAry = new int[2];

    public Struct(int suffix_i, int[] compareAry) {
        this.suffix_i = suffix_i;
        this.compareAry = compareAry;
    }

    public int compareTo(Struct st) {
        Struct other = st;
        int key0 = this.compareAry[0];
        int key1 = this.compareAry[1];
        int s0 = other.compareAry[0];
        int s1 = other.compareAry[1];
        if (key0 < s0) {
            return -1;
        } else if (key0 == s0) {
            return (key1 < s1 ? -1 : (key1 == s1 ? 0 : 1));
        } else {
            return 1;
        }
    }

    public String toString() {
        return "suffix(i)=" + this.suffix_i + ":" + compareAry[0] + "," + compareAry[1];
    }
}

1 楼 yangguo 2011-12-05

这个在面试现场写得出来么?

2 楼 leon_a 2011-12-05

yangguo 写道

这个在面试现场写得出来么?

有ACM功底,后缀数组,RMQ,二分搜索都是有模板的,唯一要写的就是对height进行分组,区区3,40行代码

3 楼 aimilin6688 2011-12-06

为什么就不能加点注释呢?

相关文章
  • 应用倍增法后缀数组以及RMQ求解N个字符串最长公共子串有关问题

    应用倍增法后缀数组以及RMQ求解N个字符串最长公共子串问题 /** * @see IOI2009国家集训队论文<后缀数组--处理字符串的有力工具> * @author leon * */ public class SuffixArray { int max_char = '\uffff'; char separator = '$'; char eof = '#'; int[][] rmq; String text = ""; int min_len = Integer.MA

  • POJ 2774 后缀数组:求最长公共子串

    思路:其实很简单,就是两个字符串连接起来,中间用个特殊字符隔开,然后用后缀数组求最长公共前缀,然后不同在两个串中,并且最长的就是最长公共子串了. 注意的是:用第一个字符串来判断是不是在同一个字符中,刚开始用了第二个字符的长度来判断WA了2发才发现. #include #include #include #include #include #include #include #include #include #define mem(a,b) memset(a,b,sizeof(a)) #defi

  • 后缀数组之最长公共子串 poj 2774

    用后缀数组求两个串的最长公共子串的长度 详见罗穗骞的论文 [cpp] #include <iostream> #include <cstdio> #include <cstring> #include <string> #include <algorithm> #include <cstdlib> #define MAXN 1000005 using namespace std; int r[MAXN]; int wa[MAXN],

  • POJ 标题2774 Long Long Message(后缀数组,求最长公共子串长度)

    POJ 题目2774 Long Long Message(后缀数组,求最长公共子串长度) Long Long Message Time Limit: 4000MS Memory Limit: 131072K Total Submissions: 23696 Accepted: 9705 Case Time Limit: 1000MS Description The little cat is majoring in physics in the capital of Byterland. A p

  • POJ3294-Life Forms 后缀数组+2分答案 大于k个字符串的最长公共子串

    POJ3294--Life Forms 后缀数组+二分答案 大于k个字符串的最长公共子串 Life Forms Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 10800 Accepted: 2967 Description You may have wondered why most extraterrestrial life forms resemble humans, differing by superficial t

  • 找工作常识储备(2)-数组字符串那些经典算法:最大子序列和,最长递增子序列,最长公共子串,最长公共子序列,字符串编辑距离,最长不重复子串,最长回文子串 找工作常识储备(2)-数组字符串那些经典算法:最大子序列和,最长递增子序列,最长公共子串,最长公共子序列,字符串编辑距离,最长不重复子串,最长回文子串

    找工作知识储备(2)---数组字符串那些经典算法:最大子序列和,最长递增子序列,最长公共子串,最长公共子序列,字符串编辑距离,最长不重复子串,最长回文子串 作者:寒小阳 时间:2013年9月. 出处:http://blog.csdn.net/han_xiaoyang/article/details/11969497. 声明:版权所有,转载请注明出处,谢谢. 0.前言 这一部分的内容原本是打算在之后的字符串或者数组专题里面写的,但看着目前火热进行的各家互联网公司笔试面试中,出现了其中的一两个内容,

  • SPOJ1811最长公共子串有关问题(后缀自动机)

    SPOJ1811最长公共子串问题(后缀自动机) 题目:http://www.spoj.com/problems/LCS/ 题意:给两个串A和B,求这两个串的最长公共子串. 分析:其实本题用后缀数组的DC3已经能很好的解决,这里我们来说说利用后缀自动机如何实现. 对于串A和B,我们先构造出串A的后缀自动机,那么然后用B串去匹配,对于B,我们一位一位地扫描,维护一个ans值,表示从 B串的开始到B[i]的这个子串与A的最长公共子串. 假设现在到B[i-1]的最长公共子串长度为ans,然后我们来看B[

  • 动态规划求解最长公共子串中的有关问题

    动态规划求解最长公共子串中的问题 今天学习了动态规划的相关思想,随后找了一些经典的题目希望能加深一下印象.然而在求解"最长公共子串"的问题时却发现了一些问题. 一般来说,在求解这类问题的时候,大都依据以下原理: 定义lcs[i][j]为序列"a0,a1,-,ai-2"和"b0,b1,-,bj-1"的最长公共子序列的长度,计算lcs[i] [j]可递归地表述如下: (1)lcs[i][j] = 0 如果i=0或j=0: (2)lcs[i][j] =

  • poj 3294 Life Forms 后缀数组求至少出现在K个字符串中的最长公共子串

    此题就是给出N个字符串,然后求一个最长的子串,它至少出现在N/2+1个字符串中, 如果有多个这样的子串,按字典序输出,如果没有这样的子串,输出?. 此题是罗穗骞论文里面的例11,他有讲述具体的解法.要用后缀数组做这样的题真不 容易,用后缀数组就感觉是一件非常纠结的事情了. 这个题的解法还是那种模式化的思路.把N个字符串连接成一个,注意中间加不出现在 任何一个字符串中的分隔符,然后建立sa数组和height数组等. 最后二分答案,根据答案,即子串的长度对height数组进行分组,分组的思路还是罗穗

  • SPOJ LCS 最长公共子串 后缀自动机&amp;后缀树(Ukkonen)

    终于搞清楚了这两个恶心的算法.其实后缀树也不难写嘛. 题目 给定两个字符串a和b,求在a和b中都有出现的连续子串的最长长度. 样例输入 alsdfkjfjkdsal fdjskalajfkdsla 样例输出 3 做法1 使用后缀自动机.clj的课件讲得很详细了,这里不细说.主要说几件事: 后缀自动机的状态的本质是right集合(见课件),parent意味着right集合的最小扩充.时刻记着这一点可以使很多性质的证明变得很直观. 有一个没什么用但挺有意思的性质是,字符串s的后缀自动机的每个状态和a

  • UVA 题目760 DNA Sequencing (后缀数组求两个串最长公共子串,字典序输出)

    DNA Sequencing A DNA molecule consists of two strands that wrap around each other to resemble a twisted ladder whose sides, made of sugar and phosphate molecules, are connected by rungs of nitrogen-containing chemicals called bases. Each strand is a

  • 后缀数组习题若干

    后缀数组练习题若干 POJ 1743 不可重叠最长重复子串 二分答案. 即子串的长度,假设为k时. 利用height数组,将排序后的后缀分为若干组. 每组内的height值都不小于k. 然后只需查看组内是否有满足要求的两个不会产生重叠的子串即可. #include <iostream> #include <cstdio> #include <cstring> #include <vector> #include <set> #include &l

  • POJ 3693 Maximum repetition substring(08合肥市 RMQ+后缀数组)

    POJ 3693 Maximum repetition substring(08合肥 RMQ+后缀数组) 转载请注明出处,谢谢http://blog.csdn.net/acm_cxlove/article/details/7854526 by---cxlove 题目:给出一个串,求重复次数最多的连续重复子串 http://poj.org/problem?id=3693 在后缀数组神文中也这题的题解. 比较容易理解的部分就是枚举长度为L,然后看长度为L的字符串最多连续出现几次. 既然长度为L的串重

  • 后缀数组练习

    后缀数组习题 原文:http://hi.baidu.com/lewutian/blog/item/4d098138d29c34f9b311c725.html 单独把它列出来是因为这个东西真的很神奇~~~ 后缀数组经典思想:多串合并+二分答案+最优性--->可行性 例 1 :最长公共前缀 给定一个字符串,询问某两个后缀的最长公共前缀. // 直接套用,ans=min( height[ i ] )+rmq k<i<=j 例 2 :可重叠最长重复子串 给定一个字符串,求最长重复子串,这两个子串

  • 后缀数组学习笔记

    要用好后缀数组要先理解里面几个数组的概念: sa[i]表示字典序第i大的后缀下标(字典序排名依次是1?len(string)); rank[i]表示下标为i的后缀字典序排名; height[i]表示sa[i]和sa[i?1]最长公共前缀的长度. 一个性质: LCP(suffix[i],suffix[j])=min{height[i+1],height[i+2]-height[j]}(rank[i] 倍增法求出这些数组, 记得在原串的末尾增加一个0: int t1[maxn],t2[maxn],c

  • 后缀数组简单总结

    主要参考: http://hi.baidu.com/ahnkftravhdhkyr/item/cc38703dd46547cd392ffab1 及cxlove博客 主要是论文<后缀数组--处理字符串的有力工具>一些题解和其它题目的主要题解 一般的模板: #include #include #include #include #include #include #include #include #include #include #define REP(i, n) for(int i=0; i

  • 后缀数组总结

    后缀数组小结 搞了这么多后缀数组,写个总结 其实罗穗赛的论文里已经都总结得很清楚了.我这里对一些代码的具体实现细节和一些要注意的地方做一些说明. 后缀数组很重要的三个数组就是:rank[],sa[]和height[]了 其中rank[i]表示i这个后缀的排名,sa[i]表示排在第i位的后缀的首字母位置,height[i]表示排名第i的后缀和排名i-1的后缀的lcp(最长公共前缀) 其中最重要的就是height数组了,我们所有的计算几乎都是要用到height数组,而sa和rank数组则是用于找到我

  • 后缀数组原理及施用详解 后缀数组原理及施用详解

    后缀数组原理及应用详解 后缀数组原理及应用详解 在pongba的讨论组上看到一道Amazon的面试题:找出给定字符串里的最长回文.例子:输入XMADAMYX.则输出MADAM.这道题的流行解法是用后缀树(Suffix Tree).这坨数据结构最酷的地方是用它能高效解决一大票复杂的字符串编程问题: 1.在文本T里查询T是否包含子串P(复杂度同流行的KMP相当). 2.文本T里找出最长重复子串.比如abcdabcefda里abc同da都重复出现,而最长重复子串是abc. 3.找出字符串S1同S2的最

  • 后缀数组-处置字符串的利器

    后缀数组--处理字符串的利器 后缀数组是处理字符串的有力工具.后缀数组是后缀树的一个非常精巧的替代品,它比后缀树容易编程实现,能够实现后缀树的很多功能而时间复杂度也并不逊色,而且它比后缀树所占用的内存空间小很多. 子串:字符串S的子串r[i..j],i<=j,表示r串中从i到j这一段,也就是顺次排列r[i],r[i+1],...,r[j]形成的字符串. 后缀:后缀是指从某个位置i开始到整个串末尾结束的一个特殊子串.字符串 s 的从第i个字符开始的后缀表示为Suffix(i), 也就是Suffix

  • 使用后缀数组找寻最长公共子字符串JavaScript版 使用后缀数组找寻最长公共子字符串JavaScript版

    使用后缀数组寻找最长公共子字符串JavaScript版 后缀数组很久很久以前就出现了,具体的概念读者自行搜索,小菜仅略知一二,不便讨论. 本文通过寻找两个字符串的最长公共子字符串,演示了后缀数组的经典应用. 首先需要说明,小菜实现的这个后缀数组算法,并非标准,只是借鉴了其中的思想. 小菜实现的算法,有两个版本,第一个是空间换时间,第二个是时间换空间. 空间换时间版本 1 /* 2 利用后缀数组获取两个字符串最长公共子字符串 3 空间换时间版本 4 @params 5 s1 String,要分析的

最新文章
  • 《我的奋斗》这本书哪里有卖?

    阿道夫·希特勒写的 --cut-- idoas在2014-12-25 09:25:4回答到: 还以为是老罗的,呵-- song940在2014-12-25 09:28:5回答到: 不是老罗的,差评 Vedar在2014-12-25 09:30:3回答到: 中二少年的日常 Rorysky在2014-12-25 09:31:1回答到: 见过地摊上有卖-- mgc在2014-12-25 09:31:5回答到: 图书馆 idoas在2014-12-25 09:32:5回答到: 英文版的亚马逊上有卖: h

  • 维基百科捐款组队建议搜集

    晚上骑单车的时候想起今年还没给维基百科捐款,一般每年都捐个 $10 或 $15 看最近 v2ex 团购比较频繁,就顺便搜一下捐款.看到还是有不少人捐款无门 http://www.v2ex.com/t/63505 咱就来发起个组队捐款: 我支付宝收钱,然后用 Paypal 一并捐去 Wikipedia,大家觉得怎么样? --cut-- fantasticfears在2014-04-18 08:13:1回答到: Paypal 这借记卡也可以付款. xgjames在2014-04-18 08:26:1

  • 2015父亲节问候短信贺词(通用版)

    1. 父亲,我的智慧,我的收获全是你辛苦的积淀;我的成长,我的成功全是你悉心的付出;我的成就,我的前途全是你真纯的呵护.父亲今天是你的节日,我深深地感谢你的爱,我愿用生命去回报你,愿你节日快乐. 2. 父亲,像那拉车的牛,驮着对家人的情,把辛苦默默忍受;父亲,像那山涧的水,淌着对家人的爱,把关怀悄悄渗透.愿天下的好父亲节日愉快! 3. 父亲的爱深如大海,一眼望不到边;父亲的情如暗潮汹涌,激烈却不明显.父亲为我付出一生的辛劳,无论怎样也难以报答您的爱.父亲节到了,祝您身体健康,快乐常在! 4. 父

  • Pinterest.com界面风格的社交展示web应用:Infinite-social-wall Pinterest.com界面风格的社交展示web应用:Infinite-social-wall

    在线演示 Infinite-Social-Wall是一个基于PHP和Mysql的开源应用,主要用来帮助你使用pinterest.com的界面风格来展示各类社交网站的事件信息. 这个应用通过指定的RSS来抓取社交网站内容,并且拥有Twitter,Reddit,Instagram,Github等的内建样式和图表. 使用免费的mysql服务器作为存储的后台,这样就不需要每次都解析feeds.前台使用Isotope插件来生成动态布局,并且可以生成无限滚动特效. 如果你需要自己创建一个类似的社交类自动更新

  • 米饭的4种营养吃法 米饭的4种营养吃法

    作为中国人最重要的主食之一,大米和我们生活有着密切联系.不过说到米饭的做法,你又能想到多少种?每天一成不变的焖米饭,是不是也觉得有些厌倦了呢?在这里,我们给大家介绍几种最流行的吃"饭"法,或许能给您带来一些"创造性"的灵感. 扬州炒饭,少用油盐 提起炒米饭,种类极多,不管是国内,还是日本.新加坡,以及东南亚地区都有各自着名的类型,而其中,扬州炒饭以其色彩分明的外观."软.糯.松.爽"的口感,赢得了最广泛的认同,从街边小店到五星级饭店似乎都能做出一

  • 我们总在互相羡慕

    我是从哪一天开始老的?不知道.就像从夏到秋,人们只觉得天气一天一天凉了,却说不出秋天究竟是哪一天来到的.生命的"立秋"是从哪一个生日开始的?不知道.青年的年龄上限不断提高,我有时觉得那都是上了年纪的人玩出的花样,为掩饰自己的衰老,便总说别人年轻. 不管怎么样,我觉得自己老了.当别人问我年龄的时候,我支支吾吾地反问一句:"您看我有多大了?"佯装的镇定当中,希望别人说出的数字要较我实际年龄稍小一些.倘若人家说的过小了,又暗暗怀疑那人是否在成心奚落.我开始越来越多地照镜子

  • 宁波电信517天翼4G免费体验活动 上演“全城热验” 宁波电信517天翼4G免费体验活动 上演“全城热验”

    昨日,宁波电信在全城开展了"靠近我 玩转天翼4G"的免费体验活动,活动开展以来,得到广大市民的热切参与,造成全城市民竞相体验天翼4G的浩瀚声势.天翼4G的极速上网体验,通过这次的免费体验活动,扎根民心,并日渐飞入寻常百姓家. 天翼MM沿街发福利 路人纷纷近身体验 据了解,宁波电信为了让天翼4G极速网络更加深入人心,让广大市民在忙碌之余有机会接触天翼4G.感受天翼4G的登天极速,特地开展了此次"靠近我 玩转天翼4G"的活动.众多天翼MM从和义路电信营业厅出发,分5条不

  • 《刀塔传奇》全民集卡活动地址分享 《刀塔传奇》全民集卡活动地址分享

    刀塔传奇全民集卡活动怎么玩?有什么奖励呢?地址在哪呢?下面小伙伴们我们一起来看吧. 刀塔传奇全新资料片--决战圣域已经上线,圣域之战.战役副本挑战模式.新英雄屠芙等海量更新内容让玩家连呼过瘾!同时,刀塔传奇官方微信推出"全民集卡 决战新大陆"活动,iWatch.骷髅王手办.钻石礼包等大奖等你承包! 玩家点击"开始集卡",即可获得一张卡牌;然后邀请好友帮你集齐5张卡牌,即可参与抽奖活动,中奖率100%.不同组合的5张卡牌奖励不同,集齐5张屠芙可获得iWatch大奖,集

  • 厦门方特攻略 厦门方特攻略

    爱玩的朋友一定知道"方特"的鼎鼎大名,没错,那就是"方特欢乐世界"游乐园!"方特"在全国有11个大型游乐园,其中一个就在厦门,其好玩程度丝毫不亚于欢乐谷. 厦门方特梦幻王国是一个以高科技为主要表现形式的文化科技主题公园.坐落于美丽的海滨古城厦门市同安区,公园占地面积约1400亩,是由深圳华强集团投资 25亿元兴建的大型高科技第四代主题公园.其最大特点是以科幻和互动体验为最大特色,将动漫卡通.电影特技等国际时尚娱乐元素与中国传统文化符号巧妙融合,创

  • 推荐音乐:重温黄家驹《光辉岁月》,致敬曼德拉! 推荐音乐:重温黄家驹《光辉岁月》,致敬曼德拉!

    "钟声响起归家的讯号,在他生命里,彷佛带点唏嘘,黑色肌肤给他的意义,是一生奉献,肤色斗争中-"1990 年,BEYOND乐队创作<光辉岁月>,歌颂了南非黑人领袖曼德拉的光辉一生.今天,曼德拉逝世蜡烛,重温,致敬! 曼德拉与黄家驹:穿越二十年的祭文 北半球的寒冬中,我们送别曼德拉,而在今年夏天,我们刚刚纪念过香港歌手黄家驹逝世二十周年.两人逝世的节点相隔久远,哀伤的思绪却如此相似. 黄家驹曾为曼德拉写过一首脍炙人口的<光辉岁月>.除此之外,两人交集寥寥.然而,他们

热门推荐
  • 头屑如何去除 头屑如何去除 其实每个人或多或少都有一些头皮屑,头皮屑为头皮新陈代谢产物,它可分为干性和油性两种.干性的多松散地分布在头皮上,梳头或抓搔头发时脱落,白色或灰白色呈鳞屑状散落一肩;油性的则多粘着在头发上,以油脂样淡黄色屑片存在.其实,去屑的方法很多,您可以试用下列几法去除头皮屑. 本站阅读配图 1.正确的洗头方式 这是避免与去除头皮屑的重要环节,避免用温度过高的热水洗头,并以指腹按摩头皮以免抓破头造成细菌感染.另外洗发的过程中可通过头皮按摩将头皮屑清除干净. 洗发之后若有头屑残留在发上时,应采取由前至后.由后至
  • 澳洲男子晚上拍灵异事件拍到妻子与儿子通奸 澳洲男子晚上拍灵异事件拍到妻子与儿子通奸 世界上每天都在发生着许多有趣的事情,下面外媒报道的一起灵异现象调查事件引起了很多人关注,但原因不是因为灵异现象,而是其妻子和儿子通奸这一事件,我们一起来看一下吧. 澳大利亚塔斯马尼亚岛上的一名男子在家里安上摄像头,想拍摄萦绕在他心头的"灵异现象".不料,摄像头非但没有拍到鬼,反而拍到他28岁的妻子和16岁的儿子通奸的画面. 澳大利亚皇家检察官杰基?哈特尼特(Jackie Hartnett)告诉最高法院,过去几年里这个女人已经是这个男子的"事实配偶"(没登记结婚),2
  • 人生若只如初见之情何以堪 人生若只如初见之情何以堪 人生若只如初见,何时秋风悲化扇,等闲变却故人心,却到故人心易变. ----题记 深夜不睡,看着<饮水词>,着实让人思绪万千,感叹不已.有一种莫名的心结似乎已经被打开,静静地闭上眼睛,感受着成长中的宁静在身体里慢慢流淌. 或许我该饮一杯淡酒,叹一下"执子之手,与子偕老,乃敢与君绝"的情深意切.或许我该在闲暇的时候,感受一下"曾经沧海难为水,除去巫山不是云"的惆怅.或许在风朗气清的时候追忆"相去万余里,各在天一涯"的忧伤. 本站阅读配图
  • 佳能原厂圆偏光滤镜实战手册 佳能原厂圆偏光滤镜实战手册 如果你钟爱风光摄影,那么你肯定需要知道佳能的PL-C B滤镜--这是佳能为风光摄影爱好者量身定制的圆偏光滤镜(很多人平时习惯称之为CPL,即偏振镜).从功能上来说,偏振镜可以过滤掉偏振光(非金属表面的反光),比如水面反光.镜面反光和大多数的玻璃折射出来的光. 佳能原厂PL-C B圆偏光镜 不仅是滤除反光那么简单! 对于偏振镜来说,最常用的场合肯定是用于消除偏振光,如果仅仅把这个功能理解成产品摄影的时候滤除一些反光,那显然就OUT了! 使用偏振镜可以让天空更蓝 摄影从来不是一件机械的事情,基于偏振
  • 索尼LT26i Xperia S刷机教程 索尼LT26i Xperia S刷机教程 很多机油都对索尼LT26i 刷机一知半解的,网络上的教程有的复杂,有的简单,然而真正的一键刷机还是接下来要讲到的索尼Xperia S刷机教程.简单的来说,就是使用完美刷机软件进行索尼LT26i 一键刷机.那么,接下来就看看这篇索尼刷机教程吧. 第一步:连接手机设备 连上手机设备,打开完美刷机软件.手动打开USB调试接口. 连接手机设备 第一次刷机,完美刷机软件自动为手机安装驱动,手动断开手机与电脑的连接,再点击我已断开手机按钮,运行软件即可. 断开USB连接 安装驱动中,耐心等待.完成后会再提示