HDU (1894 String Compare)

题目大意:给你N个单词,让你找出有多少对满足一个单词是另一个单词的前缀

题目分析:这种题目肯定要排序,这样就可以按字典顺序操作了,一个单词是另一个单词的前缀,那么这个单词肯定和他相邻,或者相近,我这里说的是按字典顺序,从小到大,从前面开始往后找,找到不是的那个为止,加上前面已经找到的,然后就这样遍历一遍就OK啦

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct node{
    char s[35];
}sim[50100];
int cmp(struct node a,struct node b){
    if(strcmp(a.s,b.s)<0)
        return 1;
    else
        return 0;
}
bool solve(char a[],char b[]){
    int len1,len2,i;
    len1=strlen(a);
    len2=strlen(b);
    char c[35];
    if(len1==len2)//注意一下这个判断就可以了,
    //因为题目说,没有两个相同的单词
        return false;
    for(i=0;i<len1;i++){
        if(a[i]!=b[i]){
            return false;
        }
    }
    return true;
}
int main(){
    int n,cas,i,j,sum;
    while(scanf("%d",&cas)!=EOF){
        while(cas--){
            sum=0;
            scanf("%d",&n);
            for(i=0;i<n;i++)
                scanf("%s",sim[i].s);
            sort(sim,sim+n,cmp);
            for(i=0;i<n-1;i++){
                for(j=i+1;j<n;j++){
                    if(solve(sim[i].s,sim[j].s))
                        sum++;
                    else
                        break;
                }
        
            }    
            if(sum>11519)
                sum=sum%11519;
            printf("%d\n",sum);
        }
    }
    return 0;
}

 

HDU 1497(Simple Library Management System)

题目大意:图书管管理系统,有三个操作,一个借书,还书,查询。

优化方案:就是一个数组存放书的信息,下标为书的代号,内容存,0或者借走这本书的同学学号,这样可以方便查询!

#include<stdio.h>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;

int stu,n;

struct node{
	int num;
	int t[15];
}s[1010];

int book[100005];

void init(){
	for(int i=1;i<=stu;i++){
		memset(s[i].t,0,sizeof(s[i].t));
		s[i].num=0;
	}
	memset(book,0,sizeof(book));
}
int cmp(int x,int y){
	return x<y;
}

int main(){
	int i,j,times;
	int x,y;
	char ch;
	while(~scanf("%d %d",&stu,&n)){
		scanf("%d",×);
		init();
		while(times--){
			j=0;
			getchar();
			scanf("%c",&ch);
			if(ch=='R'){
				scanf("%d",&x);
				if(book[x]!=0){
					printf("Return success\n");
					for(i=1;i<=9;i++){
						if(s[book[x]].t[i]==x)
							s[book[x]].t[i]=0;	
					}				
					s[book[x]].num--;
					book[x]=0;			
				}
				else
					printf("The book is already in the library\n");
				
			}
			else if(ch=='B'){
				scanf("%d %d",&x,&y);
				if(book[y]!=0){
                                 //这个地方一定得注意!因为这个WA了N次,题目说了
                                 //这个有先后顺序的,先判断书在么,再判断该同学借了9本了没
					printf("The book is not in the library now\n");
				}
				else if(s[x].num==9){
					printf("You are not allowed to borrow any more\n");
				}
				else{
					printf("Borrow success\n");
					sort(s[x].t,s[x].t+10,cmp);
					s[x].t[1]=y;
					s[x].num++;
					book[y]=x;
				}
					
			}
			else{
				scanf("%d",&x);
				sort(s[x].t,s[x].t+10,cmp);
				if(s[x].num==0)
					printf("Empty");
				//cout<<"???"<<endl;
				if(s[x].num!=0){
					for(i=1;i<=9;i++)
						if(s[x].t[i]!=0){
							printf(j==0?"%d":" %d",s[x].t[i]);
							j++;
						}
				}
				printf("\n");
			}
		}
		printf("\n");
		
	}
	return 0;
}