第一道 逻辑行计数
是个简单的模拟
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
#define bool int
#define true 1
#define false 0
#define NOTE printf("NOTE:%d\n",__LINE__)
int state=0;
int PhysicalLines=0,LogicalLines=0,ProgramNum=1,LineNum=0;
void PrintError(int type,int n)
{
if(type==1)
printf("Unterminated string in line %d.\n",n);
else if(type==2)
printf("Unterminated block comment at end of program.\n");
}
void PrintBit(int n)
{
int i=0;
for(i=7;i>=0;i--)
printf(n&(1<<i)?"1":"0");
}
void PrintMess()
{
printf("Program %d contains %d logical lines and %d physical lines.\n",
ProgramNum,LogicalLines,PhysicalLines);
ProgramNum++;
LogicalLines=PhysicalLines=0;
state=0;
}
int main()
{
char ch;
while(true)
{
if(state&(1<<5)) break;
ch=getchar();
LOOP:
switch(ch)
{
case '\'':
{
if(!(state&(1<<4))&&!(state&(1<<3))&&!(state&(1<<2)))
state^=1<<1;
break;
}
case '\"':
{
if(!(state&(1<<4))&&!(state&(1<<3))&&!(state&(1<<1)))
state^=1<<2;
break;
}
case '@':
{
if(!(state&(1<<4))) state|=1<<3;
break;
}
case '(':
{
char temp=getchar();
if(temp=='('&&!(state&(1<<4))&&!(state&(1<<3))) state^=1<<4;
else
{
ch=temp;
goto LOOP;
}
break;
}
case ')':
{
char temp=getchar();
if(temp==')'&&(state&(1<<4))&&!(state&(1<<3))) state^=1<<4;
else
{
ch=temp;
goto LOOP;
}
break;
}
case ';':
{
if(state==0)
LogicalLines++;
break;
}
case '#':
{
if(state&(1<<1)||state&(1<<2))
{
PrintError(1,PhysicalLines);
if(state&(1<<1)) state^=(1<<1);
if(state&(1<<2)) state^=(1<<2);
}
if(state&(1<<4)) PrintError(2,NULL);
PrintMess();
char temp=getchar();
if(temp=='#') state^=(1<<5);
else
if(temp!='\n')
{
ch=temp;
goto LOOP;
}
break;
}
case '\n':
{
PhysicalLines++;
if(state&(1<<3)) state^=(1<<3);
if(state&(1<<1)||state&(1<<2))
{
PrintError(1,PhysicalLines);
if(state&(1<<1)) state^=(1<<1);
if(state&(1<<2)) state^=(1<<2);
}
break;
}
default:
break;
}
// printf("%c ",ch);
// PrintBit(state);
// printf("\n");
}
return 0;
}
第二道题 电话号码问题
一开始没看清题目 写了个二叉查找树 来比较去重排序 然后就成功的TLE了
后来在题目的提示下(《编程珠玑》第一部分) 写了个位图的。。。在几次RE后 AC了
代码如下
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
#define bool int
#define true 1
#define false 0
#define NOTE printf("NOTE:%d\n",__LINE__)
//16.电话号码问题
unsigned int WT[62500];
int ErrorNum=0,DuplicationNum=0;
int NumMap[26]={2,2,2,3,3,3,4,4,4,5,5,5,6,6,6,7,0,7,7,8,8,8,9,9,9,0};
struct node
{
int num;
int data;
};
struct node Data[1505];
int cmp(const void *a,const void *b)
{
return (*(struct node*)a).data>(*(struct node*)b).data?1:-1;
}
void Clear(struct node *temp)
{
int i=0;
for(i=0;i<1505;i++)
temp[i].data=temp[i].num=0;
}
struct node* Find(int num,struct node *temp,int len)
{
int i;
for(i=0;i<len;i++)
if(temp[i].data==num)
return &temp[i];
return NULL;
}
int main()
{
int n=1,i,j;
char str[22],num[22],ch;
int point=0;
Clear(Data);
printf("Error:\n");
while(scanf("%s",str)!=EOF)
{
bool flag=0;
int len=strlen(str);
for(i=0,j=0;!flag&&i<len;i++)
{
if(str[i]=='Q'||str[i]=='Z')
flag=1;
else if(str[i]!='-')
{
if('A'<=str[i]&&str[i]<='Z')
num[j++]=NumMap[str[i]-'A']+'0';
else
num[j++]=str[i];
}
}
num[j]='\0';
// printf("%s\n",num);
if((num[0]!='3'&&num[0]!='6')||j!=7) flag=1;
if(flag)
{
ErrorNum++;
printf("%s\n",str);
}
else
{
int TEMP=0;
for(i=0;i<7;i++)
TEMP=TEMP*10+(num[i]-'0');
if(num[0]=='3')
{
int Num=TEMP-3000000;
if((WT[Num/32]&(1<<(Num%32)))>0)
{
struct node *flag=Find(TEMP,Data,point);
if(flag!=NULL)
flag->num++;
else
{
// printf("TE<P:%d\n",TEMP);
DuplicationNum++;
Data[point].data=TEMP;
Data[point++].num=2;
}
}
else
WT[Num/32]|=(1<<(Num%32));
}
else
{
int Num=TEMP-5000000;
// printf("%d %d\n",Num/32,Num%32);
// printf("%d\n",Hash_6[Num/32]&(1<<(Num%32)));
if((WT[Num/32]&(1<<(Num%32)))>0)
{
struct node *flag=Find(TEMP,Data,point);
if(flag!=NULL)
flag->num++;
else
{
// printf("TE<P:%d\n",TEMP);
DuplicationNum++;
Data[point].data=TEMP;
Data[point++].num=2;
}
}
else
WT[Num/32]|=(1<<(Num%32));
}
}
}
if(ErrorNum==0) printf("Not found.\n");
printf("\nDuplication:\n");
if(DuplicationNum==0) printf("Not found.\n");
qsort(Data,point,sizeof(struct node),cmp);
for(i=0;i<point;i++)
printf("%03d-%04d %d\n",Data[i].data/10000,Data[i].data%10000,Data[i].num);
return 0;
}