hdu4886 TIANKENG’s restaurant(Ⅱ) (trie树或者模拟进制)

TIANKENG’s restaurant(Ⅱ)

Time Limit: 16000/8000 MS (Java/Others)    Memory Limit: 130107/65536 K (Java/Others)
Total Submission(s): 456    Accepted Submission(s): 149

Problem Description

After improving the marketing strategy, TIANKENG has made a fortune and he is going to step into the status of TuHao. Nevertheless, TIANKENG wants his restaurant to go international, so he decides to name his restaurant in English. For the lack of English skills, TIANKENG turns to CC, an English expert, to help him think of a property name. CC is a algorithm lover other than English, so he gives a long string S to TIANKENG. The string S only contains eight kinds of letters-------‘A’, ‘B’, ‘C’, ‘D’, ‘E’, ‘F’, ‘G’, ‘H’. TIANKENG wants his restaurant’s name to be out of ordinary, so the restaurant’s name is a string T which should satisfy the following conditions: The string T should be as short as possible, if there are more than one strings which have the same shortest length, you should choose the string which has the minimum lexicographic order. Could you help TIANKENG get the name as soon as possible?

Meanwhile, T is different from all the substrings of S. Could you help TIANKENG get the name as soon as possible?

Input

The first line input file contains an integer T(T<=50) indicating the number of case.
In each test case:
Input a string S. the length of S is not large than 1000000.

Output

For each test case:
Output the string t satisfying the condition.(T also only contains eight kinds of letters-------‘A’, ‘B’, ‘C’, ‘D’, ‘E’, ‘F’, ‘G’, ‘H’.)

Sample Input

3
ABCDEFGH
AAABAACADAEAFAGAH
ACAC

Sample Output

AA
BB
B

题意:给一个主串s,然后要找出一个串ans,ans是s中没出现过的子串里字典序最小的

思路:很容易得知这个串的长度不会超过8,所以建一个trie树,把s中每个长度小于8的串都插入树中,最后bfs一遍看哪个结点没给标记到的就是答案。这个方法是我比赛一开始想到的好麻烦的方法。AC之后想到一个简便的方法,把他看成8进制数,abcdefg对应0到8,开一个vis数组把每个子串都标记一下,然后循环找一下就行了

trie代码: 模拟进制的懒得写了

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int maxnode = 2396744;
typedef pair<int,int> pii;
//const int maxnode = 1000000;
const int sigma_size = 8;

struct Trie{
    int ch[maxnode][sigma_size];
    int fa[maxnode];
    char let[maxnode];
    int sz;
    void init()
    {
        sz=1;
        memset(ch[0],0,sizeof(ch[0]));
    }
    int idx(char c) {return c-‘A‘;}
    void insert(char *s,int n)
    {
        int u=0;
        for(int i=0;i<n;++i)
        {
            int c=idx(s[i]);
            if(!ch[u][c])
            {
                memset(ch[sz],0,sizeof(ch[sz]));
                fa[sz]=u;
                let[sz]=c+‘A‘;
                ch[u][c]=sz++;
                if(sz>=maxnode)
                    cout<<"fuck this memory"<<endl;
            }
            u=ch[u][c];
        }
    }
    char ans[10];
    int ansz;
    void bfs()
    {
        int u;
        queue<int> q;
        q.push(0);
        while(!q.empty())
        {
            u=q.front();
            q.pop();
            for(int i=0;i<sigma_size;++i)
            {
                if(ch[u][i])
                {
                    q.push(ch[u][i]);
                }
                else
                {//find
//                    cout<<"find "<<u<<endl;
                    ans[0]=i+‘A‘;
                    ansz=1;
                    print(u);
                    return;
                }
            }
        }
    }
    void print(int u)
    {
        while(u)
        {
//            cout<<".";
            ans[ansz++]=let[u];
            u=fa[u];
        }
//        cout<<"sz="<<ansz<<endl;
        for(int i=ansz-1;i>=0;--i)
            printf("%c",ans[i]);
        printf("\n");
    }
    void text()
    {
        int i;
        for(i=0;i<sz;++i)
        {
            printf("%d: fa=%d let=%c\n",i,fa[i],let[i]);
        }
    }
};

char ms[1000005];
Trie tree;

void run()
{
    int i,len;
    scanf("%s",ms);
    len = strlen(ms);
    tree.init();
    for(i=0;i<len;++i)
    {
        tree.insert(ms+i,min(8,len-i));
    }
//    tree.text();
    tree.bfs();
}

int main()
{
    //freopen("in","r",stdin);
    int _;
    scanf("%d",&_);
    while(_--)
        run();
    return 0;
}
时间: 2024-11-12 22:50:37

hdu4886 TIANKENG’s restaurant(Ⅱ) (trie树或者模拟进制)的相关文章

HDU4814——数学,模拟进制转换

本题围绕:数学公式模拟进制转换 HDU4814 Golden Radio Base 题目描述 将一个十进制的非负整数转换成E(黄金分割数)进制的数 输入 不大于10^9的非负整数,处理到文件尾 输出 转换成的E进制数(可能含有小数) 样例输入 1 2 3 6 10 样例输出 1 10.01 100.01 1010.0001 10100.0101 题目分析 对于本题,要注意的点有:首先对于一个十进制的正数,我们是可以严格转换成一个E(黄金分割数)进制的数的,而不是涉及到约等于,例如10-base的

hdu 4099 Revenge of Fibonacci Trie树与模拟数位加法

Revenge of Fibonacci 题意:给定fibonacci数列的前100000项的前n位(n<=40);问你这是fibonacci数列第几项的前缀?如若不在前100000项范围内,输出-1: 思路:直接使用数组模拟加法,再用Trie树插入查找即可:但是一般使用new Trie()的代码都是MLE的.反而我之前写的,直接得到数组大小的maxnode版本的内存可以接受:并且还有一点就是前40位的精度问题:由于是自己计算出来的finboncci数列,并不是系统给的,所以1的进位不会形成递推

Spreadsheets codeforces1B(模拟+进制转换)

http://codeforces.com/problemset/problem/1/B 题意:转换两种行和列的表示方法. 分析:(弱弱的说下一开始自己并不会写,只是想到AA=26*1+1,就想着用除法和余数来解决了,后来发现这么模拟下去,数据好大啊,心好累..然后就没有然后了).后来问的别人,告诉我用26进制转换(我去,我为啥想不到,啥都别说了,看代码) #include <iostream> #include <stdio.h> #include <string.h>

HDU 4883 TIANKENG’s restaurant Bestcoder 2-1(模拟)

TIANKENG's restaurant Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others) Total Submission(s): 0    Accepted Submission(s): 0 Problem Description TIANKENG manages a restaurant after graduating from ZCMU, and tens of t

hdu4883 TIANKENG’s restaurant 模拟下就好了

TIANKENG's restaurant Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others) Total Submission(s): 102    Accepted Submission(s): 45 Problem Description TIANKENG manages a restaurant after graduating from ZCMU, and tens o

HDU 4883 TIANKENG’s restaurant(模拟)

题意  天坑开了个饭店  他知道所有客人的进来时间和出去的时间  求天坑至少准备多少张凳子 以分钟为单位 直接模拟就行了   peo[i]代表第i分钟的人  第i组人第si分钟进来 第so分钟出去  那么j从si到so  peo[j]都加上这组的人数  最后看第几分钟人最多就是答案了 #include<cstdio> #include<cstring> using namespace std; const int N = 1441; int hi, ho, mi, mo, si,

【BZOJ4523】[Cqoi2016]路由表 Trie树模拟

[BZOJ4523][Cqoi2016]路由表 Description 路由表查找是路由器在转发IP报文时的重要环节.通常路由表中的表项由目的地址.掩码.下一跳(Next Hop)地址和其他辅助信息组成.例如: 当路由器收到一个IP报文时,会将报文中的目的IP地址与路由表中的表项逐条进行比较,选择匹配且最明确的表项,将报文转发给该表项中指定的下一跳. 匹配的过程是将报文中的目的地址和表项中的目的地址分别转为二进制串,再查看表项中的掩码长度,若掩码长度为x,则将两个二进制串的前x位进行比较,如果相

BZOJ 2741【FOTILE模拟赛】L 分块+可持久化Trie树

题目大意 给出一个序列,求[l, r]中的最大连续xor 和. 强制在线 思路 先把整个序列分成n  √  块,预处理每一块的开头到每个数字的最大连续xor 和.这个我们只需处理出前缀xor 和,之后用可持久化Trie树就可以搞定.这样询问的右边就是整块的了.剩下左边的随便暴力一下就能过了.. CODE #define _CRT_SECURE_NO_WARNINGS #include <cmath> #include <cstdio> #include <cstring>

[CSP-S模拟测试]:Race(数学+Trie树)

题目描述 一年一度的运动会开始了.有$N$个选手参赛,第$i$个选手有一个能力值(保证$A[i]$两两不同),比赛一共进行了天.在第$j$天($0\leqslant j\leqslant 2^{m-1}$)的比赛中,第$i$个选手的得分为$A[i]\ xor\ j$,然后从大到小排名,排名为$x$($x$从$0$开始)的同学会获得的积分,你需要求出每个同学最后总的积分和$q[i]$模${10}^9+7$的结果$p[i]$.为了避免输出文件过大,你只要输出$p[i]$的异或和即可. 输入格式 第一