码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 4886 TIANKENG’s restaurant(Ⅱ) hash+dfs

时间:2017-04-24 12:30:00      阅读:106      评论:0      收藏:0      [点我收藏+]

标签:cto   using   dfs   int   turn   --   can   std   short   

题意:

1、找一个字符串s使得 s不是给定母串的子串

2、且s要最短

3、s在最短情况下字典序最小

hash。,,结果t掉了。。。加了个姿势怪异的hash值剪枝才过。。

#include <cstdio>
#include <cstdlib>
#include <map>
#include <set>
#include <algorithm>
#include <cstring>
#include <iostream>
#include <vector>
#include <string>
#include <queue>
using namespace std;
#define N 1000100
#define ll long long
#define mod 2496764 
char s[N];
short h[8][mod], tim;
bool f = false;
bool dfs(ll top, ll siz, ll dep) {
    if (siz > 1000000) return false;
    if(top == dep)
    {
        for(ll i = 0; i < 8; i++)
        {
            if(h[top][siz * 8 + i] != tim)
            {
                s[top] = i + ‘A‘;
                s[top+1] = 0;
                f = true;
                return true;
            }
        }
        return false;
    }
    for(ll i = 0; i < 8; i++)
    {
        s[top] = i + ‘A‘;
        if(dfs(top+1, siz * 8 + i, dep))return true;
    }
    return false;
}

int main(){
    int i, j, T; scanf("%d",&T);
    tim = 0;

    while(T--) {
        tim ++;
        scanf("%s", s);
        f = false;
        for(i = 0; s[i]; i++)
        {
            ll ans = 0;
            for(j = 0; j < 7 && s[i+j]; j++)
            {
                ans = ans * 8 + s[i + j] - ‘A‘;
                h[j][ans] = tim;
            }
        }

       for(i = 0; i < 8; i++)
            if(dfs(0, 0, i))break;
        puts(s);
    }
    return 0;
}


HDU 4886 TIANKENG’s restaurant(Ⅱ) hash+dfs

标签:cto   using   dfs   int   turn   --   can   std   short   

原文地址:http://www.cnblogs.com/cynchanpin/p/6755296.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!