Join the Conversation

Join the Conversation

pdf

解决方案:最长公共升子序列的模型,此题的最大问题就是名字的获取问题,没发现名字中间可能有'@',一直没发觉,wa了很多次,TT

code:

#include <iostream>
#include<cstdio>
#include<cstring>
#include<map>
using namespace std;
char input[2000];
char name[2000];
char mention[2000];
int dp[600000];
int fa[600000];
int path[600000];
map<string,int>Max;
map<string,int >key;
int main()
{
    int t;
    //  freopen("in.txt","r",stdin);
      //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    while(~scanf("%d",&t))
    {

        Max.clear();
        key.clear();
        getchar();
        int MMax=1,en=1;
        memset(dp,0,sizeof(dp));
        memset(fa,-1,sizeof(fa));
        for(int s=1; s<=t; s++)
        {
            gets(input);
            int len=strlen(input);
            int i,j=0,u=0;
            for(i=1; i<len; i++)
            {
                if(input[i]==':') break;

                name[j++]=input[i];
            }
            name[j]='\0';
            int temp=1;
            int n=i+1;
            for(n; n<len; n++)
            {
                if((input[n-1]==' '||n==i+1)&&input[n]=='@')
                {
                    int k;
                    u=0;
                    for(k=n+1; input[k]!=' '&&k<len; k++)
                    {
                        mention[u++]=input[k];
                    }
                    mention[u]='\0';
                   // cout<<name<<" "<<mention<<endl;
                    if(strcmp(name,mention)==0)
                    {
                        n=k;
                        continue;
                    }
                    else
                    {
                        n=k;
                        if(Max[mention])
                        {
                            if(Max[mention]+1>temp)
                            {
                                fa[s]=key[mention];
                                temp=Max[mention]+1;
                            }
                        }
                    }
                }
            }
            dp[s]=temp;
            if(Max[name]<temp)
            {
                Max[name]=temp;
                key[name]=s;
            }

            if(MMax<dp[s])
            {
                MMax=dp[s];
                en=s;
            }
        }
        printf("%d\n",MMax);
        int o=0;
        path[o++]=en;
        while(fa[en]!=-1)
        {
            path[o++]=fa[en];
            en=fa[en];
        }
        for(int mm=o-1; mm>=0; mm--)
        {
            printf("%d%c",path[mm],mm==0?'\n':' ');
        }
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值