hdu 3937

来源:互联网 发布:肛门灌啤酒 知乎 编辑:程序博客网 时间:2024/06/05 20:43

 http://acm.hdu.edu.cn/showproblem.php?pid=3937

中文描述,题意就没问题了。也没什么好说的,字典树,判断条形码所表示的字符得思考下

直接贴代码

#include<stdio.h>#include<string.h>#include<math.h>#include<algorithm>using namespace std;#define ep 1e-8const int kind=64;#define maxn 3000550int tree[maxn][kind],top;void init(){top=1;memset(tree[0],0,sizeof(tree[0]));}void insert(char *s){int rt,nxt,i=0,k;for(rt=0;s[i];rt=nxt,i++){if(s[i]>='A'&&s[i]<='Z')k=s[i]-'A';else if(s[i]>='a'&&s[i]<='z')k=s[i]-'a'+26;elsek=s[i]-'0'+52;nxt=tree[rt][k];if(nxt==0){tree[rt][k]=nxt=top;memset(tree[top],0,sizeof(tree[top]));tree[nxt][kind-1]=1;top++;}elsetree[nxt][kind-1]++;}}int search(char *s,int ss,int tt){int rt=0,i,k;for(i=ss;i<=tt;i++){if(s[i]>='A'&&s[i]<='Z')k=s[i]-'A';else if(s[i]>='a'&&s[i]<='z')k=s[i]-'a'+26;elsek=s[i]-'0'+52;if(tree[rt][k]==0) return 0;rt=tree[rt][k];}return tree[rt][kind-1];}//判断条形码所表示的字符struct node{int bit;double d;}a[8];bool cmp(node a,node b){return a.d<b.d;}int check(node a[]){sort(a,a+8,cmp);double Max=a[0].d/0.95; //白色条形码的最小宽度double Min=a[7].d/2.10; //白色条形码的最大宽度if(Min>Max) return -1;double l=Min*0.85;      //白色条形码与黑色条形码的最小宽度差for(int i=1;i<8;i++){double dis=a[i].d-a[i-1].d;if((dis>l||fabs(dis-l)<ep))return i;}return 0;}int main(){int n,m,N,i,j,k,flag,p,r;char str[32],s[40];char begin[]={'b','e','g','i','n'};char end[]={'e','n','d'};while(scanf("%d%d",&n,&m)!=EOF){init();for(i=0;i<n;i++){scanf("%s",str);insert(str);}for(k=0;k<m;k++){scanf("%d",&N);memset(s,0,sizeof(s));flag=0;for(i=0;i<N;i++){for(j=0;j<8;j++){scanf("%lf",&a[j].d);a[j].bit=7-j;}if(flag||N<=8) continue;if((r=check(a))==-1)flag=1;else{for(p=r;p<8;p++)s[i]+=(1<<a[p].bit);if(i<5&&s[i]!=begin[i])flag=1;if(i>=N-3&&s[i]!=end[i-N+3])flag=1;if(!((s[i]>='0'&&s[i]<='9')||(s[i]>='a'&&s[i]<='z')||(s[i]>='A'&&s[i]<='Z')))flag=1;}}if(flag||N<=8)printf("wrong barcode!\n");else{int ans=search(s,5,N-4);printf("%d\n",ans);}}}return 0;}