2015ACM/ICPC亞洲區瀋陽站---題解
阿新 • • 發佈:2018-12-13
思路:就暴力匹配就好了,然後加一個剪枝,如果這個字串是某個字串的子串的話,就不用檢查他了就是個思維,還用了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區。給出區之間有聯絡的圖以及到達所需時間。求兩個人見面最短時間以及可以在哪些區碰面
思路:就是個裸的最短路,,但是這個構圖方式真的新穎,沒見過沒見過,重現賽期間實在是沒有沒有想出來~