Description
给出一个字符串 s s 和个字符串 bi b i ,要求从 s s 中选取最长子串使得该子串不以这个字符串中任一个串为子串,输出该子串的长度和起始位置
Input
首先输入字符串 s s ,之后输入一整数,最后输入 n n 个字符串
(1≤|s|≤105,1≤n,|bi|≤10) ( 1 ≤ | s | ≤ 10 5 , 1 ≤ n , | b i | ≤ 10 )
Output
输出所需子串的长度和起始位置
Sample Input
Go_straight_along_this_street
5
str
long
tree
biginteger
ellipse
Sample Output
12 4
Solution
尺取,每次加入一个字符后暴力判断是否会完全匹配上所给 n n 个字符串,如果匹配上则左端点右移直至没有匹配,如果没有匹配则更新最优解并右端点右移,时间复杂度
Code
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<ctime>
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
const int INF=0x3f3f3f3f,maxn=100005;
int n,m,len[11];
char s[11][11],c[maxn];
bool check(int l,int r,int i)
{
if(r-l+1<len[i])return 0;
for(int j=len[i]-1,k=r;j>=0;j--,k--)
if(c[k]!=s[i][j])return 0;
return 1;
}
int main()
{
scanf("%s%d",c,&n);
m=strlen(c);
for(int i=1;i<=n;i++)
{
scanf("%s",s[i]);
len[i]=strlen(s[i]);
}
int ansl=0,ansp=0,l=0,r=0;
while(l<m)
{
int flag=0;
for(int i=1;i<=n;i++)
if(check(l,r,i))
{
flag=1;
l++;
r=max(r,l);
break;
}
if(!flag&&r-l+1>ansl)ansl=r-l+1,ansp=l;
if(!flag)
{
if(r<m-1)r++;
else break;
}
}
printf("%d %d\n",ansl,ansp);
return 0;
}