2015ACM/ICPC亚洲区沈阳站---题解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37868325/article/details/82928100

B - Bazinga

http://acm.hdu.edu.cn/showproblem.php?pid=5510

思路:就暴力匹配就好了,然后加一个剪枝,如果这个字符串是某个字符串的子串的话,就不用检查他了就是个思维,还用了KMP,,其实不用也可以,用strstr()过的时间更短。。

代码:

#include <bits/stdc++.h>
using namespace std;
const int MAXN=2005;

int n;
char str[505][MAXN];
bool ok[MAXN][MAXN];
int nex[MAXN][MAXN],nex2[MAXN],fa[MAXN];

void getNext(int son)
{
    int lenw=strlen(str[son]);
    nex[son][0]=nex[son][1]=0;
    nex2[0]=nex2[1]=0;
    for(int i=1;i<lenw;i++)
    {
        int j=nex2[i];
        while(j&&str[son][i]!=str[son][j])
            j=nex2[j];
        nex2[i+1]=nex[son][i+1]=(str[son][i]==str[son][j])?j+1:0;
        if(nex[son][i+1]==j+1&&str[son][i+1]==str[son][j+1])
            nex[son][i+1]=nex[son][j+1];
    }
}

int getKMP(int son,int fa)
{
    int lenw=strlen(str[son]);
    int lent=strlen(str[fa]);
    //getNext(son);
    //cout<<"!!"<<endl;
    int j=0;
    for(int i=0;i<lent;i++)//i fa
    {
        while(j&&str[son][j]!=str[fa][i])
            j=nex[son][j];
        if(str[son][j]==str[fa][i])
            j++;
        if(j==lenw)
            return 1;
    }
    return 0;
}

int main()
{
    int T,cas=0;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            scanf("%s",str[i]);

        for(int i=1;i<=n;i++)
            getNext(i),fa[i]=0;

        int ans=-1;
        for(int i=2;i<=n;i++)
        {
            for(int j=1;j<i;j++)
            {
                if(fa[j]==1) continue;
               if(getKMP(j,i)==0) {ans=i;break;}
               else {fa[j]=1;
               }
            }
        }
        printf("Case #%d: %d\n",++cas,ans);

    }
    return 0;
}

D - Pagodas

 http://acm.hdu.edu.cn/showproblem.php?pid=5512

思路:思维,推一下,循环递减,就像是求gcd过程,最后的最小数就是两数的gcd、并且是所有数的等差。

代码:

#include<bits/stdc++.h>
using namespace std;
int T,n,a,b,s,x,y;
int main()
{
    s=0;
    scanf("%d",&T);
    while(T--)
    {
        s++;
        scanf("%d%d%d",&n,&a,&b);
        x=__gcd(a,b);
        y=n/x-2;
        if(y%2==0) printf("Case #%d: Iaka\n",s);
        else printf("Case #%d: Yuwgna\n",s);
    }
    return 0;
}

M - Meeting

 题意:A,B两个人分别在1和n区。给出区之间有联系的图以及到达所需时间。求两个人见面最短时间以及可以在哪些区碰面

思路:就是个裸的最短路,,但是这个构图方式真的新颖,没见过没见过,重现赛期间实在是没有没有想出来~

猜你喜欢

转载自blog.csdn.net/qq_37868325/article/details/82928100
今日推荐