1. 程式人生 > >2015ACM/ICPC亞洲區瀋陽站---題解

2015ACM/ICPC亞洲區瀋陽站---題解

思路:就暴力匹配就好了,然後加一個剪枝,如果這個字串是某個字串的子串的話,就不用檢查他了就是個思維,還用了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;
}

思路:思維,推一下,迴圈遞減,就像是求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;
}

 題意:A,B兩個人分別在1和n區。給出區之間有聯絡的圖以及到達所需時間。求兩個人見面最短時間以及可以在哪些區碰面

思路:就是個裸的最短路,,但是這個構圖方式真的新穎,沒見過沒見過,重現賽期間實在是沒有沒有想出來~