【GDOI2103模拟3.17】电话表
来源:互联网 发布:昆明知行科技有限公司 编辑:程序博客网 时间:2024/06/05 08:46
2103年的题目真是超神了!!!
题目大意不想说,直接上题目了。
题目
在幻想乡拨打不同的电话号码收费标准是完全不同的。博丽神社有一个古老的费用表,来确定拨打电话的花费。
每一个幻想乡的电话号码由11 位数字组成。费用表共有N 行,每一行给出一个号码的前缀范围和对应收费标准的名称。对于给出的前缀,如4239-241 ,指所有的前缀为4239,4240,4241 的电话号码。要确定拨打每个号码的收费标准,需要从费用表的第一行开始依次向下查找,第一个匹配的号码前缀范围所对应的收费标准即为拨打这个号码的收费标准。如果没有找到匹配的前缀,那么认为此号码无效。无效号码的收费标准定义为’invalid’(不带引号)。一种收费标准的名称可以在表上多次出现。
博丽神社的费用表已经很旧了,包含了很多很多的数据,这使得管理变得非常困难。神社的巫女决定将这份费用表修改到更简单易读的格式。她希望表内所有号码前缀都按照字典序排序,并且没有‘-’符号,同时没有一个串是另一个串的前缀,且串的总个数最少。’invalid’
和原先不存在的收费标准不能出现在新费用表中。
输入
每组数据的第一行有一个整数N,含义如上所述。
接下来N 行,描述了一张费用表,每行元素按顺序分别为前缀A,字母‘-’,前缀B,该收费标准的名字。前缀最多有11 个数字,收费标准由1~20 个小写字母组成。保证B 的长度<=A 的长度,且A 的后|B|个数字的小于等于B。
特别暴力的想法
建出一棵Trie,暴力插入在
更加先进的想法
我们发现,其实在
贴一下代码:
#include<iostream>#include<cstdio>#include<algorithm>#include<cmath>#include<numeric>#include<cstring>#include<queue>#include<functional>#include<set>#include<map>#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 ch; while (ch=getchar(),(ch<'0'||ch>'9')&& ch!='-'); char c=ch; int s=0; if (c!='-')s=c-48; while (ch=getchar(),ch>='0'&&ch<='9')s=s*10+ch-48; return c=='-'?-s:s;}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){ fo(i,w,len1) if (l[i])return 0; return 1;}bool r9(int w){ fo(i,w,len1) if (r[i]<9)return 0; return 1;}void inse(int now,int w,int id){ if (pd[now])return; if (w>11||(now&&l0(w)&&r9(w)&&!vis[now])){ cost[now]=id; pd[now]=1; return; } 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){ if (!a[now][x])a[now][x]=++tot; inse(a[now][x],w+1,id); return; } 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){ inse(a[now][i],w+1,id); } 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){ return (ls[x]!=7||s[x][1]!='i'||s[x][2]!='n'||s[x][3]!='v'||s[x][4]!='a'||s[x][5]!='l'||s[x][6]!='i'||s[x][7]!='d');}void get_cost(int now,int len){ if (pd[now]&&now&&check(cost[now])){ fo(i,1,len-1)printf("%d",l[i]); printf(" "); fo(i,1,ls[cost[now]])printf("%c",s[cost[now]][i]); printf("\n"); } if (pd[now])return; fo(i,0,9)if (a[now][i]){ l[len]=i; get_cost(a[now][i],len+1); }}void get_ans(int now){ if (pd[now]&&now&&check(cost[now]))ans++; if (pd[now])return; fo(i,0,9)if (a[now][i])get_ans(a[now][i]);}bool diff(int x,int y){ if (ls[x]!=ls[y])return 1; fo(i,1,ls[x]) if (s[x][i]!=s[y][i])return 1; return 0;}void getdown(int now){ if (pd[now])return; int v(0); fo(i,0,9)if(a[now][i])getdown(a[now][i]); fo(i,0,9){ if (!a[now][i]||!pd[a[now][i]])return; if (v&&cost[a[now][i]]&&diff(v,cost[a[now][i]]))return; else v=cost[a[now][i]]; } if (!v||!now)return; cost[now]=v; pd[now]=1;}int main(){ while (scanf("%d",&n)!=EOF){ fo(i,0,tot)cost[i]=pd[i]=0; fo(i,0,tot) fo(j,0,9)a[i][j]=0; fo(i,0,tot)vis[i]=0; tot=0; fo(i,1,n){ char ch; fo(j,1,11)l[j]=0,r[j]=9; while(ch=getchar(),ch<'0'||ch>'9'); l[len1=1]=ch-'0'; while(ch=getchar(),ch>='0'&&ch<='9')l[++len1]=ch-'0'; while (ch=getchar(),ch<'0'||ch>'9'); r[len2=1]=ch-'0'; while (ch=getchar(),ch>='0'&&ch<='9')r[++len2]=ch-'0'; while(ch=getchar(),ch<'a'||ch>'z'); s[i][ls[i]=1]=ch; while(ch=getchar(),ch>='a'&&ch<='z')s[i][++ls[i]]=ch; fd(j,len1,len1-len2+1)r[j]=r[j-len1+len2]; fo(j,1,len1-len2)r[j]=l[j]; inse(0,1,i); } getdown(0); ans=0; get_ans(0); printf("%d\n",ans); get_cost(0,1); }}
- 【GDOI2103模拟3.17】电话表
- 【GDOI2103模拟3.17】数树数
- GDOI2016模拟8.14电话表
- 电话客户服务模拟
- 电话客户服务模拟
- 电话客户服务模拟
- 电话客户服务模拟
- 命令行模拟拨打电话、短信
- Android模拟器 模拟短信,电话
- 命令行模拟拨打电话、短信
- NOIP2011模拟9.17 电话时间
- 外企英语电话面试应急模拟
- Ophone模拟器如何模拟电话呼入
- android模拟拨打电话的实现
- jzoj 2567. 【NOIP2011模拟9.17】电话时间
- 2567. 【NOIP2011模拟9.17】电话时间 (StandardIO)
- Asterisk 配置PSTN模拟卡,实现SIP 软电话通过PSTN固定电话向外打外线电话
- 模拟电话和数字电话有什么区别?优点和缺点!!!
- 用VC控制系统音量
- NHibernate之旅(17):探索NHibernate中使用存储过程(下)
- NHibernate之旅(18):初探代码生成工具使用
- NHibernate之旅(19):初探SchemaExport工具使用
- PorterDuff.Mode 图片合成模式理解
- 【GDOI2103模拟3.17】电话表
- js去除空格、换行
- HA规范的理解1 - ZStack中节点消息处理的过程
- Leetcode#36||Valid Sudoku
- Leetcode#37||
- LeetCode Rectangle Area
- 接受一个整数输入,显示所有小于或等于该数的素数
- 一起学CC3200之HttpServer数据传输(中序)
- 关键问题可能不是出在技术上