天天看点

Trie|STL|hash+uva10887

这题的输入有点坑

#include<iostream>
#include<cstdio>
#include<cstring>
#include<set>
using namespace std;
const int maxn=1510;
int n,m;
char a[maxn][100],b[maxn][100],x[100];
int main()
{
    //freopen("in.txt","r",stdin);
    int t;
    scanf("%d%*c",&t);
    for(int cas=1;cas<=t;cas++)
    {
        scanf("%d%d%*c",&n,&m);
        set<string> s;
        for(int i=0;i<n;i++)
            gets(a[i]);
        for(int i=0;i<m;i++)
            gets(b[i]);

        for(int i=0;i<n;i++)
        {
            char tmp[300]={'\0'};
            for(int j=0;j<m;j++)
            {

                strcpy(tmp,a[i]);
                strcat(tmp,b[j]);
                s.insert(string(tmp));
            }
        }
        printf("Case %d: %d\n",cas,s.size());
    }
    return 0;
}
           

也可以用Trie树做

#include<stdio.h>
#include<string.h>
int head[10000017],next[3000000];
char st[3000000][25],b[25];
int hash(char *str)
{
    int seed=31,v=0;
    while(*str)
    {
        v=v*seed+*(str++);    
    }
    return (v&0x7FFFFFFF)%10000017;
}
int insert(int s)
{
    int i,h;
    h=hash(st[s]);
    for(i=head[h];i!=-1;i=next[i])
        if(strcmp(st[i],st[s])==0)
            break;
    if(i==-1)
    {
        next[s]=head[h];
        head[h]=s;
        return 1;
    }
    else
        return 0;
}
int main()
{
    int i,j,k,M,N,ans,t,tt;
    gets(b);
    sscanf(b,"%d",&t);
    for(tt=0;tt<t;tt++)
    {
        gets(b);
        sscanf(b,"%d%d",&M,&N);
        ans=0;
        memset(head,-1,sizeof(head));
        for(i=0;i<M;i++)
            gets(st[i]);
        for(j=0;j<N;j++)
        {
            gets(st[i]);
            for(k=0;k<M;k++)
            {
                strcpy(st[i+k+1],st[k]);
                strcpy(st[i+k+1]+strlen(st[i+k+1]),st[i]);
                if(insert(i+k+1))
                    ans++;
            }
            i=i+M+1;
        }
        printf("Case %d: %d\n",tt+1,ans);
    }
    return 0;    
}
           

继续阅读