标签:har 字符串 代码 tle show can name scan \n
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5510
思路:
一开始直接用KMP莽了发,超时了,后面发现如果前面的字符串被后面的字符串包含,那么我们就不需要用前面的字符串去比较了,把他标记掉就好了。
实现代码:
#include<iostream> #include<algorithm> #include<cstring> #include<cstdio> using namespace std; char s[505][2050]; int vis[510]; int next1[2050]; int slen,tlen; void get_next(char *mat) { int j,k; tlen=strlen(mat); j=0;k=-1;next1[0]=-1; while(j<tlen) { if(k==-1||mat[j]==mat[k]) next1[++j]=++k; else k=next1[k]; } } int kmp_pos(char *str,char *mat) { int i=0,j=0; slen=strlen(str); get_next(mat); while(i<slen&&j<tlen) { if(j==-1||str[i]==mat[j]) { i++;j++; } else j=next1[j]; } if(j==tlen) return i-tlen; return -1; } int main() { int tt,n; int ttt=0; scanf("%d",&tt); while(tt--) { ttt++; int sum=-1; scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%s",s[i]); vis[i] = 1; } int flag=0; int st = 1; for(int i = 2;i <= n;i ++){ int ans=kmp_pos(s[i],s[i-1]); if(ans != -1) vis[i-1] = 0; } for(int i=n;i>=1;i--) { flag=0; for(int j=i-1;j>=1;j--) { if(vis[j]==0) continue; int ans=kmp_pos(s[i],s[j]); if(ans==-1) { flag=1;break; } } if(flag==1) { sum=i;break; } } printf("Case #%d: ",ttt); printf("%d\n",sum); } }
标签:har 字符串 代码 tle show can name scan \n
原文地址:https://www.cnblogs.com/kls123/p/9783760.html