HDU 5510 Bazinga 暴力匹配加剪枝
思路: 标记每个字符串前面的子串,如果一个字符串a,前面一个是字符串b,b是a的子串,然后就继续往前找,找到字符串c,然后 发现字符串c被标记了,说明c是b的子串,那么c必是a的子串,也可以这样理解如果b是a的子串,那么b的所有子串(即b串前被标记了的字符串)都是a的子串。就这样剪枝。
#include<stdio.h>
#include<string.h>
using namespace std;
char s[505][2005];
int vis[505];
int main()
{
int t;
int icase=0;
scanf("%d",&t);
while(t--)
{
icase++;
memset(vis,0,sizeof(vis));
int n,ans=-1;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%s",s[i]);
for(int j=i-1;j>=1;j--)
{
if(vis[j]) continue;
if(strstr(s[i],s[j])==NULL) {ans=i;break;}
else
vis[j]=1;
}
}
printf("Case #%d: %d\n",icase,ans);
}
return 0;
}