cogs 1176. [郑州101中学] 月考

1176. [郑州101中学] 月考

★   输入文件:mtest.in   输出文件:mtest.out   简单对比
时间限制:1 s   内存限制:128 MB

【题目描述】

在上次的月考中Bugall同学违反了考场纪律还吃了处分,更可气的是在第二天的校会时
 间学校就此事做了全校通报. 现已知在当天校会时间有总共N个同学听到了有关Bugall的处分决定.
 
 Bugall同学在铁一有M个朋友,这M个人中有的可能听到了当天的处分决定,有的可能没
 有听到,现在Bugall同学想知道他有几个朋友听到了当天的处分通报.

【输入格式】

第一行为一个整数N,从第2行到N+1行,每行用一个长度不超过200的字符串表示
 一个人的名字.
  第N+2行为一个整数M,从第N+3行到N+M+2行,每行用一个长度不超过200的字符
 串表示Bugall同学一个朋友的名字.

【输出格式】

输出有几个Bugall同学的铁一朋友在当天的校会时间听到了Bugall处分通报.保证不重名。

【样例输入】

3
Dazui
Erge
Dapigu
2
Varpro
Erge

【样例输出】

1

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std;
#define Mod 1000003
#define mod 1000000007
int n,m,head[1000010],num,ans;
struct node{
    int to,pre;
}e[100100];
char c[250];
void add(int from,int to){
    e[++num].to=to;
    e[num].pre=head[from];
    head[from]=num;
}
bool check(int from,int x){
    for(int i=head[from];i;i=e[i].pre){
        if(e[i].to==x)return 1;
    }return 0;
}
int main(){
    freopen("mtest.in","r",stdin);
    freopen("mtest.out","w",stdout);
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%s",c);
        int len=strlen(c);
        long long haxi=1,ha2=1;
        for(int j=0;j<len;j++)haxi=(haxi*233+c[j])%mod;
        for(int j=0;j<len;j++) ha2=(ha2*29+c[j])%Mod;
        add(ha2,haxi);
    }
    scanf("%d",&m);
    for(int i=1;i<=m;i++){
        scanf("%s",c);
        int len=strlen(c);
        long long haxi=1,ha2=1;
        for(int j=0;j<len;j++)haxi=(haxi*233+c[j])%mod;
        for(int j=0;j<len;j++) ha2=(ha2*29+c[j])%Mod;
        if(check(ha2,haxi))ans++;
    }
    printf("%d",ans);
}
原文地址:https://www.cnblogs.com/thmyl/p/7197123.html