hdu4096Universal Question Answering System(乱搞)

题目请戳这里

题目大意:给t组数据,每组为不超过1000行的文本,每行是一个陈述句或者疑问句或者感叹句。感叹句表示一组case结束。陈述句给定一组关系,疑问句表示一个询问。陈述句分2种句式,疑问句相应的也有2种疑问句式。具体看input。

题目分析:对于每个陈述句,可以抽象出一对关系。比如a are b,那么a->b建边。每个陈述句就有一个关系。这样边读入句子就边建图。对于每个疑问句,相当于一个查询,比如are a b?,那么从a开始遍历图,看能否到达b,能到达b,则Y,否则M。

trick:这是11年上海现场赛的一道题目。这场现场赛真是凶残,一题铜三题金。题目是有些偏难,但是做3题+的队伍不多,因为题目和数据确实比较。。。

就本题来说,应该不难的,但这题还是贡献了n次WA才A掉。主要trick比较多:

1,可能出现are a a的询问,即使a之前并没有出现过。那么对于这个询问是显然正确的,要处理。特别不能特判,认为询问之前没有出现过的单词查询都是M。

2,对于陈述和疑问的2种句式,看input的意思是固定的,其实不然。判断2种句式的时候千万不能按句子的内容来判断,像以第一个单词是否是everything或者第二个单词是否是which来判断第几种句式,这样会错的。但是句子的长度是不变的,那就根据句子的单词数判断。

3,数据中给的动词和名词要分开算!!因为可能出现动词和名词一样的case。

详情请见代码:

#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#include<string>
using namespace std;
const int N = 3005;
const int M = 1000005;
int head[N];
struct node
{
    int to,next;
}e[M];
bool vis[N];
int num,id;
char s1[10005],s[9][100];
map<string,int>non,verb;
bool flag;
void build(int s,int ed)
{
    e[num].to = ed;
    e[num].next = head[s];
    head[s] = num ++;
}
void gofind(int cur,int tag)
{
    vis[cur] = true;
    if(flag)
        return;
    if(cur == tag)
    {
        flag = true;
        return;
    }
    int i;
    for(i = head[cur];~i;i = e[i].next)
        if(vis[e[i].to] == false)
            gofind(e[i].to,tag);
}
int main()
{
    int t,cas = 0;
    scanf("%d",&t);
    gets(s1);
    while(t --)
    {
        non.clear();verb.clear();
        memset(head,-1,sizeof(head));
        num = id = 1;
        printf("Case #%d:\n",++cas);
        while(gets(s1))
        {
            int len = strlen(s1);
            if(s1[len - 1] == '!')
                break;
            else if(s1[len - 1] == '.')
                {
                    s1[len - 1] = '\0';
                    if(sscanf(s1,"%s%s%s%s%s%s",s[0],s[1],s[2],s[3],s[4],s[5]) != 6)
                    {
                        sscanf(s1,"%s%s%s",s[2],s[3],s[4]);
                        string a,b;
                        a = s[2];b = s[4];
                        if(non.find(a) == non.end())
                            non[a] = id ++;
                        if(s[3][0] == 'a')
                        {
                            if(non.find(b) == non.end())
                                non[b] = id ++;
                            build(non[a],non[b]);
                        }
                        else
                        {
                            if(verb.find(b) == verb.end())
                                verb[b] = id ++;
                            build(non[a],verb[b]);
                        }
                    }
                    else
                    {
                        sscanf(s1,"%s%s%s%s%s%s",s[2],s[2],s[2],s[2],s[3],s[4]);
                        string a,b;
                        a = s[2];b = s[4];
                        if(verb.find(a) == verb.end())
                            verb[a] = id ++;
                        if(s[3][0] == 'a')
                        {
                            if(non.find(b) == non.end())
                                non[b] = id ++;
                            build(verb[a],non[b]);
                        }
                        else
                        {
                            if(verb.find(b) == verb.end())
                                verb[b] = id ++;
                            build(verb[a],verb[b]);
                        }
                    }
                }
                else if(s1[len -1] == '?')
                {
                    memset(vis,false,sizeof(vis));
                    s1[len - 1] = '\0';
                    if(sscanf(s1,"%s%s%s%s%s%s",s[0],s[1],s[2],s[3],s[4],s[5]) != 6)
                    {
                        sscanf(s1,"%s%s%s",s[3],s[2],s[4]);
                        string a,b;
                        a = s[2];b = s[4];
                        if(non.find(a) == non.end())
                            non[a] = id ++;
                        if(s[3][0] == 'a')
                        {
                            if(non.find(b) == non.end())
                                non[b] = id ++;
                            flag = false;
                            gofind(non[a],non[b]);
                            if(flag)
                                putchar('Y');
                            else
                                putchar('M');
                        }
                        else
                        {
                            if(verb.find(b) == verb.end())
                                verb[b] = id ++;
                            flag = false;
                            gofind(non[a],verb[b]);
                            if(flag)
                                putchar('Y');
                            else
                                putchar('M');
                        }
                    }
                    else
                    {
                        sscanf(s1,"%s%s%s%s%s%s",s[3],s[3],s[3],s[3],s[2],s[4]);
                        string a,b;
                        a = s[2];b = s[4];
                        if(verb.find(a) == verb.end())
                            verb[a] = id ++;
                        sscanf(s1,"%s",s[3]);
                        if(s[3][0] == 'a')
                        {
                            if(non.find(b) == non.end())
                                non[b] = id ++;
                            flag = false;
                            gofind(verb[a],non[b]);
                            if(flag)
                                putchar('Y');
                            else
                                putchar('M');
                        }
                        else
                        {
                            if(verb.find(b) == verb.end())
                                verb[b] = id ++;
                            flag = false;
                            gofind(verb[a],verb[b]);
                            if(flag)
                                putchar('Y');
                            else
                                putchar('M');
                        }
                    }
                }
        }
        putchar(10);
    }
    return 0;
}


你可能感兴趣的:(模拟)