BZOJ 3045 电话线路 暴力

思路:题干太长,而且很简单,这就不说了。。

思路:本来想着T了就写后缀数组,或者加堆优化什么的,结果直接就A了。。

CODE:

#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define MAX 50010
#define MAXE 5000010
#define BASE 2333
#define INF 0x3f3f3f3f
using namespace std;

unsigned long long power[20];

struct Complex{
    char s[12];
    int _id,num[10];
    unsigned long long hash,_hash,sorting;

    bool operator <(const Complex &a)const {
        return sorting < a.sorting;
    }
    void Read(int p) {
        _id = p;
        scanf("%s",s + 1);
        hash = _hash = 0;
        for(int i = 1; i <= 10; ++i) {
            hash = hash * BASE + s[i];
            ++num[s[i] - '0'];
        }
        for(int i = 0; i <= 9; ++i)
            _hash = _hash * BASE + num[i];
    }
    int LCP(const Complex &a)const {
        for(int i = 1;; ++i)
            if(s[i] != a.s[i])
                return i - 1;
        return 0;
    }
}src[MAX];

int cnt;
int cost[10];

void Pretreatment()
{
    power[0] = 1;
    for(int i = 1; i <= 15; ++i)
        power[i] = power[i - 1] * BASE;
}

int head[MAX],total;
int next[MAXE],aim[MAXE],length[MAXE];

inline void Add(int x,int y,int len)
{
    next[++total] = head[x];
    aim[total] = y;
    length[total] = len;
    head[x] = total;
}

inline void AddEdge(int l,int r)
{
    for(int i = l; i <= r; ++i)
        for(int j = i + 1; j <= r; ++j) {
            int lcp = src[i].LCP(src[j]);
            Add(src[i]._id,src[j]._id,cost[lcp]);
            Add(src[j]._id,src[i]._id,cost[lcp]);
        }
}

inline void AddEdge(int l,int r,bool flag)
{
    for(int i = l; i <= r; ++i)
        for(int j = i + 1; j <= r; ++j)
            if(src[i]._hash == src[j]._hash) {
                int lcp = src[i].LCP(src[j]);
                Add(src[i]._id,src[j]._id,cost[lcp]);
                Add(src[j]._id,src[i]._id,cost[lcp]);
            }
}

int SPFA()
{
    static int f[MAX];
    static bool v[MAX];
    static queue<int> q;
    memset(f,0x3f,sizeof(f));
    f[1] = 0;
    q.push(1);
    while(!q.empty()) {
        int x = q.front(); q.pop();
        v[x] = false;
        for(int i = head[x]; i; i = next[i])
            if(f[aim[i]] > f[x] + length[i]) {
                f[aim[i]] = f[x] + length[i];
                if(!v[aim[i]]) {
                    v[aim[i]] = true;
                    q.push(aim[i]);
                }
            }
    }
    return f[cnt] == INF ? -1:f[cnt];
}

int main()
{
    Pretreatment();
    cin >> cnt;
    for(int i = 0; i <= 9; ++i)
        scanf("%d",&cost[i]);
    for(int i = 1; i <= cnt; ++i)
        src[i].Read(i);
    for(int i = 1; i <= 10; ++i) {
        for(int j = 1; j <= cnt; ++j)
            src[j].sorting = src[j].hash - power[10 - i] * src[j].s[i];
        sort(src + 1,src + cnt + 1);
        unsigned long long now = src[1].sorting;
        int last = 1;
        for(int j = 1; j <= cnt; ++j)
            if(src[j].sorting != now) {
                AddEdge(last,j - 1);
                last = j;
                now = src[j].sorting;
            }
        AddEdge(last,cnt);
    }
    for(int i = 1; i <= 10; ++i)
        for(int j = i + 1; j <= 10; ++j) {
            for(int k = 1; k <= cnt; ++k)
                src[k].sorting = src[k].hash - power[10 - i] * src[k].s[i] - power[10 - j] * src[k].s[j];
            sort(src + 1,src + cnt + 1);
            unsigned long long now = src[1].sorting;
            int last = 1;
            for(int k = 1; k <= cnt; ++k)
                if(src[k].sorting != now) {
                    AddEdge(last,k - 1,false);
                    last = k;
                    now = src[k].sorting;
                }
            AddEdge(last,cnt,false);
        }
    cout << SPFA() << endl;
    return 0;
}

时间: 2024-10-09 15:26:44

BZOJ 3045 电话线路 暴力的相关文章

BZOJ 1054题解 BFS暴力求解

BZOJ 1054题解 BFS暴力求解 1054: [HAOI2008]移动玩具 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1884  Solved: 1033[Submit][Status][Discuss] Description 在一个4*4的方框内摆放了若干个相同的玩具,某人想将这些玩具重新摆放成为他心中理想的状态,规定移动 时只能将玩具向上下左右四个方向移动,并且移动的位置不能有玩具,请你用最少的移动次数将初始的玩具状态移 动到某人

BZOJ 2120 数颜色 暴力

题目大意:给定一个序列,提供两种操作: 1.查询[l,r]区间内有多少不同的数字 2.单点修改 n,m<=1W 树套树?主席树?啥都不需要!这题暴力才2s,不要想复杂了!妥妥水过! 数字离散化一下!标记用时间戳代替!675B秒切!不是一般爽! ...好吧如果觉得这样没啥意思可以试试树状数组套bitset 应该会快一些 总之50%达成 假期进度:66.7% 死ね #include<cstdio> #include<cstring> #include<iostream>

BZOJ 3251 树上三角形 暴力

题目大意:给定一棵树,每个点上有点权,多次修改点权,以及查询两点间路径上所有点权之间能否找出三个值构成三角形的三边长 被逗了- - 首先考虑如果一些数不能构成三角形的三边长,那么这些数最多有多少个? 显然当这些数构成斐波那契数列的时候数值的个数最多- - 那么2^31以内共有多少个斐波那契数?46! 也就是说当两点间路径上的点>=47时答案一定是YES! 那么小于47时只要暴力就行- - 时间复杂度O(mlogk) 其中k是最大的数的大小- - #include <cstdio> #in

BZOJ 2120 色彩数 暴力

标题效果:给定一个序列,两种操作: 1.询[l,r]间隔多少个不同的号码 2.单点变化 n,m<=1W 树盖树?树董事长?因此不必! 暴力之前,这个问题2s,不想复杂!适当的水太! 离散化一下!标记用时间戳取代! 675B秒切! 不是一般爽. . ..好吧假设认为这样没啥意思能够试试树状数组套bitset 应该会快一些 总之50%达成 假期进度:66.7% 死ね #include<cstdio> #include<cstring> #include<iostream&g

BZOJ 1028: [JSOI2007]麻将 暴力

1028: [JSOI2007]麻将 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php?id=1028 Description 麻将是中国传统的娱乐工具之一.麻将牌的牌可以分为字牌(共有东.南.西.北.中.发.白七种)和序数牌(分为条子.饼子.万子三种花色,每种花色各有一到九的九种牌),每种牌各四张.在麻将中,通常情况下一组和了的牌(即完成的牌)由十四张牌组成.十四张牌

BZOJ 2241 打地鼠(特技暴力)

果然暴力出奇迹.. O(n^2m^2)=1e8 536ms能过. 枚举锤子的长和宽,再验证是否可以满足条件并更新答案. 我们先从左上角为(1,1)的先锤,显然锤的次数是a[1][1]. 锤(i,j)的时候呢,算一下右下角为(i,j)的锤数组的矩形面积,然后更新(i,j)的值. 用二维前缀和可以做到O(1). # include <cstdio> # include <cstring> # include <cstdlib> # include <iostream&

【BZOJ 4059】 (分治暴力|扫描线+线段树)

4059: [Cerc2012]Non-boring sequences Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 632  Solved: 227 Description 我们害怕把这道题题面搞得太无聊了,所以我们决定让这题超短.一个序列被称为是不无聊的,仅当它的每个连续子序列存在一个独一无二的数字,即每个子序列里至少存在一个数字只出现一次.给定一个整数序列,请你判断它是不是不无聊的. Input 第一行一个正整数T,表示有T组数据.每组数

bzoj 2241: [SDOI2011]打地鼠 暴力

2241: [SDOI2011]打地鼠 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 749  Solved: 488[Submit][Status][Discuss] Description 打地鼠是这样的一个游戏:地面上有一些地鼠洞,地鼠们会不时从洞里探出头来很短时间后又缩回洞中.玩家的目标是在地鼠伸出头时,用锤子砸其头部,砸到的地鼠越多分数也就越高. 游戏中的锤子每次只能打一只地鼠,如果多只地鼠同时探出头,玩家只能通过多次挥舞锤子的方式打掉

「Poetize7」电话线路

描述 每台电话都有一个独一无二的号码,用一个十位的十进制数字串表示.电话a和b之间能直接通信,当且仅当“a与b之间仅有一个数字不同”,或者“交换a的某 两位上的数字后,a与b相同”.而a.b之间建立通信联系所需要的时间为cost[ lcp(a,b) ],其中cost[]是一个常数数 组,lcp(a,b)表示a.b的最长公共前缀的长度,lcp(a,b)越大,通信时间越快.另外,如果a.b能通信,b.c能通信,那么a.c也能借助b来通信.a.c借助b建立通信联系所用时间是cost[ lcp(a,b)