Bazinga HDU - 5510 (暴力)

xiaoxiao2021-02-27  223

题意:

给你n(1<=n<=500)个长度最多为2000的字符串,现在让你找出最大的i使得存在j(1<=j

思路:

直接暴力比较每个字符串是不是当前考虑的这个字符串的子串,然后加上一个优化就是从最近的一个字符串开始,这个字符串满足其前面的字符串都是当前串的子串,然后还有就是如果待比较的字符串长度明显不满足直接返回false。然后判断是不斯匹配我写了一个KMP,不知道不用KMP能不能过

代码:

#include<cstring> #include<cctype> #include<cstdio> #include<iostream> #include<algorithm> using namespace std; const int maxn=500+10; const int maxlen=2000+10; char str[maxn][maxlen]; int kase=0; void solve(); bool check(char * s,char * t); int main() { int T; kase=0; scanf("%d",&T); while(T--){ kase++; solve(); } return 0; } void solve() { int n; scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%s",str[i]); } int ans=-1; int pre=1; bool flag; for(int i=2;i<=n;i++){ flag=true; for(int j=pre;j<i;j++){ if(!check(str[j],str[i])){ ans=max(ans,i); flag=false; break; } } if(flag){ pre=max(pre,i); } } printf("Case #%d: %d\n",kase,ans); } void getfail(char * s,int n,int * f); bool check(char * s,char * t) { int n=strlen(s),m=strlen(t); if(n>m) return false; static int fail[maxlen]; getfail(s,n,fail); int j=0; for(int i=0;i<m;i++){ while(j&&s[j]!=t[i]) j=fail[j]; if(s[j]==t[i]) j++; if(j==n) return true; } return false; } void getfail(char * s,int n,int * f) { f[0]=0; f[1]=0; int j=0; for(int i=1;i<n;i++){ j=f[i]; while(j&&s[j]!=s[i]) j=f[j]; if(s[j]==s[i]) j++; f[i+1]=j; } }
转载请注明原文地址: https://www.6miu.com/read-11306.html

最新回复(0)