单词分类

【题目描述】

当组成这两个单词的各个字母数量均相等时,这两个单词可以分为一类。

例如“AABAC”和“CBAAA”归为一类,和“AAABB”不是一类。

现有N个单词,所有单词均由大写字母组成,每个单词的长度不超过100,询问这些单词会被分成几类。

【输入描述】

第一行输入一个数;

接下来N行,每行输入一个单词。

【输出描述】

输出一个数,表示答案。

【样例输入】

3

AABAC

CBAAA

AAABB

【样例输出】

2

【数据范围及提示】

对于70%的数据,N ≤ 100;

对于100%的数据,N ≤ 10000。

源代码:

#include<cstdio>
#include<cstring>
#define INF1 1000007
#define INF2 10003
struct Node
{
    int T1,T2;
}i[10001];
int n,Num(0),Prime[26];
void Euler() //欧拉筛法。
{
    int Num(0);
    bool f[102]={0};
    for (int a=2;a<102;a++)
    {
        if (!f[a])
          Prime[Num++]=a;
        for (int b=0;b<Num&&a*Prime[b]<102;b++)
        {
            f[a*Prime[b]]=true;
            if (!(a%Prime[b]))
              break;
        }
    }
}
int main() //一言不合双Hash。
{
    Euler();
    scanf("%d",&n);
    getchar();
    for (int a=0;a<n;a++)
    {
        char S[101];
        bool T(0);
        gets(S);
        int Sum1=1,Sum2=1,Length=strlen(S);
        for (int a=0;a<Length;a++)
          Sum1=(Sum1*Prime[S[a]-'A'])%INF1;
        for (int a=0;a<Length;a++) //妈的最后一个点被卡了,那就双Hash,你不是很能吗。
          Sum2=(Sum2*Prime[S[a]-'A'])%INF2;
        for (int a=1;a<=Num;a++)
          if (Sum1==i[a].T1&&Sum2==i[a].T2)
          {
            T=true;
            break;
          }
        if (!T)
        {
            i[++Num].T1=Sum1;
            i[Num].T2=Sum2;
        }
    }
    printf("%d",Num);
    return 0;
}
原文地址:https://www.cnblogs.com/Ackermann/p/5971224.html