回 帖 发 新 帖 刷新版面

主题:第34次编程比赛第2题

问题描述:

某人有一个奇怪的嗜好,就是看见一个单词就有找它所有的变位词的冲动。一个单词的变位词就是该单词所有字母的一个排列(单词中字母可能重复)。

输入输出格式:

输入数据第一行为一个整数n,1<=n<=10^5,之后n行每行只包含一个单词,不含词组。这些单词构成了字典。每个单词长度不大于9个字母。接着一行为一个整数m,1<=m<=100,表示将看见的单词数。之后 m 行每行包含一个单词。(题目中出现的每个单词都只由小写字母和 '-' 组成,可能字符 27 个)

对应随后看到的每个单词,输出落在字典里的它的变位词的个数。

输入样例
3
tea
ate
eat
3
ate
abc
eat
输出样例
3
0
3

通过标准输入/输出进行输入/输出。

关于题目有任何问题到如下处提:
http://www.programfan.com/club/showbbs.asp?id=179992


回复列表 (共11个回复)

11 楼

#include <iostream.h>

struct utl
{
    unsigned long g1;
    unsigned short g2;
};

struct slt
{
    unsigned short num;
    slt *p,*n;
};

inline void chang(utl &s,char str[])
{

    unsigned short i(0),t0;
    slt *p,*q,*f,*l;
    s.g1=0;
    s.g2=0;
    p=new slt;
    p->n=p;
    p->p=p;
    l=f=p;
    t0=str[i]-'a'+1;
    if (t0<=0 || t0>26) t0=27;
    p->num=t0;
    i++;
    while(str[i]!='\0')
    {
        q=new slt;
        t0=str[i]-'a'+1;
        if (t0<=0 || t0>26) t0=27;
        q->num=t0;
        p=f;
        while(p->num<t0 && p!=l)
            p=p->n;
        if (p->num<t0)
        {
            p->n=q;
            q->p=p;
            q->n=q;
            l=q;
        }
        else 
        {
            if(p==f)
            {
                q->n=p;
                q->p=q;
                p->p=q;
                f=q;
            }
            else
            {
                q->n=p;
                q->p=p->p;
                p->p->n=q;
                p->p=q;
                
            }
        }
        i++;
    }
    p=f;
    i=i>6?6:i;
    p=f;
    while(p!=l)
    {
        if(i)
        {
            s.g1<<=5;
            s.g1+=p->num;
            i--;
        }
        else
        {
            s.g2<<=5;
            s.g2+=p->num;
        }
        q=p;
        p=p->n;
        delete q;
    }
    if(i)
    {
        s.g1<<=5;
        s.g1+=p->num;
        i--;
        delete p;
    }
    else
    {
        s.g2<<=5;
        s.g2+=p->num;
        delete p;
    }    
}

int main()
{
    utl *see,dir;
    char str[10];
    int m,n,i,sm,j;
    cin>>n;
    see=new utl[n];
    for(i=0;i<n;i++)
    {
        cin>>str;
        chang(see[i],str);
    }
    cin>>m;
    for(i=0;i<m;i++)
    {
        sm=0;
        cin>>str;
        chang(dir,str);
        for(j=0;j<n;j++)
            if (dir.g1==see[j].g1 && dir.g2==see[j].g2)
                sm++;
        cout<<sm<<endl;
    }
    return 0;
}

我来回复

您尚未登录,请登录后再回复。点此登录或注册