首页 > 代码库 > cf 762C. Two strings
cf 762C. Two strings
因为要删去1个串(读错题),所以就直接二分搞就好了。
需要预处理出2个分别从头到尾,或从尾到头需要多长a串的数组,然后二分删去多长就好了。
1 #include<bits/stdc++.h> 2 #define LL long long 3 #define N 100005 4 #define lowbit(x) x&(-x) 5 using namespace std; 6 inline int ra() 7 { 8 int x=0,f=1; char ch=getchar(); 9 while (ch<‘0‘ || ch>‘9‘) {if (ch==‘-‘) f=-1; ch=getchar();} 10 while (ch>=‘0‘ && ch<=‘9‘) {x=x*10+ch-‘0‘; ch=getchar();} 11 return x*f; 12 } 13 char a[N], b[N]; 14 int fl[N], fr[N]; 15 int la, lb, i, j, mid, l, r, a1, a2; 16 int main() 17 { 18 scanf("%s%s",a+1,b+1); 19 la=strlen(a+1); lb=strlen(b+1); 20 for (i=1,fl[0]=j=0; b[i]; i++) 21 { 22 for (j++; j<=la && a[j]!=b[i]; j++); 23 fl[i]=j; 24 } 25 for (i=lb, fr[lb+1]=j=la+1; b[i]; i--) 26 { 27 for (j--; j>0 && a[j]!=b[i]; j--); 28 fr[i]=j; 29 } 30 for (l=0,r=lb; l<=r;) 31 { 32 mid=(l+r)>>1; 33 for (i=0; i+mid<=lb; i++) 34 if (fl[i]<fr[i+mid+1]) break; 35 if (i+mid<=lb) a1=i,a2=mid+i+1,r=mid-1; 36 else l=mid+1; 37 } 38 for (int i=1; i<=a1; i++) putchar(b[i]); 39 for (int i=a2; i<=lb; i++) putchar(b[i]); 40 if (a2-a1>lb) putchar(‘-‘); 41 return 0; 42 }
cf 762C. Two strings
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。