Minimum Integer sequence HDU - 3522(扩展KMP)

Posted yijiull

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Minimum Integer sequence HDU - 3522(扩展KMP)相关的知识,希望对你有一定的参考价值。

Minimum Integer sequence

 HDU - 3522 

题意:

几行代码看了一个多小时!!吐血!!

明天再来补题~

技术分享
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=100010;
 4 char s[maxn],t[maxn];
 5 int lens,lent;
 6 int nex[maxn],ex[maxn];
 7 int best;
 8 
 9 void getnex(char* t){
10     nex[0]=lent;
11     int a=0,p=0;
12     for(int i=1;i<lent;i++){
13         if(i>=p||i+nex[i-a]>=p){
14             if(i>=p) p=i;
15             while(p<lent&&t[p]==t[p-i]) p++;
16             nex[i]=p-i;
17             a=i;
18         }else nex[i]=nex[i-a];
19     }
20 }
21 void exkmp(char* s,char* t){
22     getnex(t);
23     int a=0,p=0;
24     for(int i=0;i<lens;i++){
25         if(i>=p||i+nex[i-a]>=p){
26             if(i>=p) p=i;
27             while(p<lens&&p-i<lent&&s[p]==t[p-i]) p++;
28             ex[i]=p-i;
29             a=i;
30         }else ex[i]=nex[i-a];
31     }
32 }
33 bool smaller(int x,int j){
34     if(ex[j]+j<x) return s[j+ex[j]]<t[ex[j]];
35     if(nex[x-j]+x-j<lent) return t[nex[x-j]]<t[x-j+nex[x-j]];
36     if(nex[lent-(x-j)]<x-j) return t[lent-(x-j)+nex[lent-(x-j)]]<t[nex[lent-(x-j)]];
37     return 0;
38 }
39 int main(){
40     while(scanf("%s%s",s,t)!=EOF){
41         lens=strlen(s);lent=strlen(t);
42         exkmp(s,t);
43         best=0;
44         for(int i=0;i<lens;i++){
45             if(smaller(i+1,best)) best=i+1;
46         }
47         for(int i=0;i<best;i++) putchar(s[i]);
48         printf("%s",t);
49         printf("%s\n",s+best);
50     }
51     return 0;
52 }
View Code

 

 

终于a掉了500题!!!

留念!!

以上是关于Minimum Integer sequence HDU - 3522(扩展KMP)的主要内容,如果未能解决你的问题,请参考以下文章

801. Minimum Swaps To Make Sequences Increasing 为使两个数组严格递增,所需要的最小交换次数

实现 C++14 make_integer_sequence

Minimum Integer CodeForces - 1101A (思维+公式)

Minimum Height Trees

310. Minimum Height Trees

CF1101A Minimum Integer 模拟