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区。给出区之间有联系的图以及到达所需时间。求两个人见面最短时间以及可以在哪些区碰面
思路:就是个裸的最短路,,但是这个构图方式真的新颖,没见过没见过,重现赛期间实在是没有没有想出来~