GDOI2103模擬3 17 電話表

2021-07-04 14:36:57 字數 2622 閱讀 1955

2023年的題目真是超神了!!!

題目大意不想說,直接上題目了。

題目

在幻想鄉撥打不同的**號碼收費標準是完全不同的。博麗神社有乙個古老的費用表,來確定撥打**的花費。

每乙個幻想鄉的**號碼由11 位數字組成。費用表共有n 行,每一行給出乙個號碼的字首範圍和對應收費標準的名稱。對於給出的字首,如4239-241 ,指所有的字首為4239,4240,4241 的**號碼。要確定撥打每個號碼的收費標準,需要從費用表的第一行開始依次向下查詢,第乙個匹配的號碼字首範圍所對應的收費標準即為撥打這個號碼的收費標準。如果沒有找到匹配的字首,那麼認為此號碼無效。無效號碼的收費標準定義為』invalid』(不帶引號)。一種收費標準的名稱可以在表上多次出現。

博麗神社的費用表已經很舊了,包含了很多很多的資料,這使得管理變得非常困難。神社的巫女決定將這份費用表修改到更簡單易讀的格式。她希望表內所有號碼字首都按照字典序排序,並且沒有『-』符號,同時沒有乙個串是另乙個串的字首,且串的總個數最少。』invalid』

和原先不存在的收費標準不能出現在新費用表中。

輸入

每組資料的第一行有乙個整數n,含義如上所述。

接下來n 行,描述了一張費用表,每行元素按順序分別為字首a,字母『-』,字首b,該收費標準的名字。字首最多有11 個數字,收費標準由1~20 個小寫字母組成。保證b 的長度<=a 的長度,且a 的後|b|個數字的小於等於b。

特別暴力的想法

建出一棵trie,暴力插入在ai

與bi 之間的長度為

11 的數字,最後直接把整棵trie掃一遍輸出就好了。

更加先進的想法

我們發現,其實在tr

ie中有一些子樹是沒有必要將其中所有的節點都開的,因為在插入ai

到bi 之間的數字時,很大機率會存在有子樹會變滿的情況,又由於優先順序的問題,我們後面插入到tr

ie中的數字不會影響當前插入的,所以可以給每個tr

ie中的節點乙個標記,表示這棵子樹的收費標準是否相同,這樣就不必插入所有的數字,最後掃一遍求答案就好了。

貼一下**:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define fo(i,a,b) for(int i=a;i<=b;i++)

#define fd(i,a,b) for(int i=a;i>=b;i--)

using

namespace

std;

const

int maxn = 110;

const

int lim = 100010;

int get()

char s[maxn][25];

int ls[maxn];

int l[15],r[15],a[lim][10];

int len1,len2;

int tot,cost[lim],ans,n;

bool pd[lim],vis[lim];

bool l0(int w)

bool r9(int w)

void inse(int now,int w,int id)

vis[now]=1;

char l[15],r[15];

fo(i,1,11)l[i]=l[i],r[i]=r[i];

int x=l[w],y=r[w];

if (x==y)

fo(i,w+1,11)l[i]=0,r[i]=9;

fo(i,x,y)

if(!a[now][i])a[now][i]=++tot;

fo(i,x+1,y-1)

fo(i,w+1,11)l[i]=l[i];

inse(a[now][x],w+1,id);

fo(i,w+1,11)l[i]=0,r[i]=r[i];

inse(a[now][y],w+1,id);

fo(i,w,11)l[i]=l[i],r[i]=r[i];

}bool check(int x)

void get_cost(int now,int len)

if (pd[now])return;

fo(i,0,9)if (a[now][i])

}void get_ans(int now)

bool diff(int x,int y)

void getdown(int now)

if (!v||!now)return;

cost[now]=v;

pd[now]=1;

}int main()

getdown(0);

ans=0;

get_ans(0);

printf("%d\n",ans);

get_cost(0,1);

}}

GDOI模擬 排列

給你m個對1到n的排列的特徵,特徵有兩種 1 x y v 排列的第x個數到第y個數之間的最大值為v 2 x y v 排列的第x個數到第y個數之間的最小值為v 要求你還原出這個排列。刷水有益身心健康。既然是求方案,資料範圍又很小,那麼明顯的要用把點向權值連邊。然後他每次給出範圍之後再進行刪邊。最後,二...

GDOI模擬8 21總結

今天做了cqoi2013的題。第一次5個小時做5道題 先看了半小時的題。t5是初中做過的原題,記得是處理出上下界然後暴力列舉就行了,就先打了t5,花了乙個小時搞定了t5,過了樣例和自己出的幾個資料就沒管了 沒對拍是因為我覺得資料生成器有點難搞 然後這題做法本來就是暴力 然後去看了下之前沒怎麼看懂題的...

GDOI模擬2015 08 18 解密

給定一篇由若干個單詞構成的原文,還有乙個由若干個單詞組成的句子。加密文是由原文單詞通過某個單詞 可能一樣 替換而成的,原文相同單詞一定會被相同加密文單詞替換。沒有兩個不同的原文單詞被同乙個加密文單詞替換。要求找出句子在加密文中第一次出現的位置。原文本元總和不超過 1000000 句子字元總和不超過 ...