zoukankan      html  css  js  c++  java
  • E.Text Editor (Gym 101466E + 二分 + kmp)

    题目链接:http://codeforces.com/gym/101466/problem/E

    题目:

    题意:

      给你s串和t串,一个数k,求t的最长前缀串在s串中出现次数不少于k。

    思路:

      一眼二分+kmp,二分最长前缀串的长度即可。

    代码实现如下:

     1 #include <set>
     2 #include <map>
     3 #include <queue>
     4 #include <stack>
     5 #include <cmath>
     6 #include <bitset>
     7 #include <cstdio>
     8 #include <string>
     9 #include <vector>
    10 #include <cstdlib>
    11 #include <cstring>
    12 #include <iostream>
    13 #include <algorithm>
    14 using namespace std;
    15 
    16 typedef long long ll;
    17 typedef pair<ll, ll> pll;
    18 typedef pair<ll, int> pli;
    19 typedef pair<int, ll> pil;;
    20 typedef pair<int, int> pii;
    21 typedef unsigned long long ull;
    22 
    23 #define lson i<<1
    24 #define rson i<<1|1
    25 #define lowbit(x) x&(-x)
    26 #define bug printf("*********
    ");
    27 #define debug(x) cout<<"["<<x<<"]" <<endl;
    28 #define FIN freopen("D://code//in.txt", "r", stdin);
    29 #define IO ios::sync_with_stdio(false),cin.tie(0);
    30 
    31 const double eps = 1e-8;
    32 const int mod = 1e9 + 7;
    33 const int maxn = 1e5 + 7;
    34 const double pi = acos(-1);
    35 const int inf = 0x3f3f3f3f;
    36 const ll INF = 0x3f3f3f3f3f3f3f3f;
    37 
    38 int k, lens1, lens2, ans, num;
    39 char s1[maxn], s2[maxn];
    40 int nex[maxn];
    41 
    42 void get_next() {
    43     nex[1] = 0;
    44     for(int i = 2, j = 0; i <= lens2; i++) {
    45         while(j > 0 && s2[i] != s2[j+1]) j = nex[j];
    46         if(s2[i] == s2[j+1]) j++;
    47         nex[i] = j;
    48     }
    49 }
    50 
    51 void kmp() {
    52     get_next();
    53     for(int i = 1, j = 0; i <= lens1; i++) {
    54         while(j > 0 && (j == lens2 || s1[i] != s2[j+1])) j = nex[j];
    55         if(s1[i] == s2[j+1]) j++;
    56         if(j == lens2) {
    57             num++;
    58         }
    59     }
    60 }
    61 
    62 bool check(int x) {
    63     lens2 = x;
    64     num = 0;
    65     kmp();
    66     return num >= k;
    67 }
    68 
    69 int main() {
    70     fgets(s1 + 1, maxn, stdin);
    71     fgets(s2 + 1, maxn, stdin);
    72     scanf("%d", &k);
    73     lens1 = strlen(s1 + 1), lens2 = strlen(s2 + 1);
    74     int ub = lens2, lb = 0, mid;
    75     ans = 0;
    76     while(ub >= lb) {
    77         mid = (ub + lb) >> 1;
    78         if(check(mid)) {
    79             ans = mid;
    80             lb = mid + 1;
    81         } else {
    82             ub = mid - 1;
    83         }
    84     }
    85     if(ans > 0) {
    86         for(int i = 1; i <= ans; i++) {
    87             printf("%c", s2[i]);
    88         }
    89         printf("
    ");
    90     }
    91     else printf("IMPOSSIBLE
    ");
    92     return 0;
    93 }
  • 相关阅读:
    Mina入门:mina版之HelloWorld
    Mina入门:Java NIO基础概念
    Activity与Service进行数据交互
    Android 6.0权限全面详细分析和解决方案
    查看Android系统是User模式还是Eng模式
    修改 Android 5.x 系统默认音量大小
    Android执行程序或脚本的方法
    Android Launcher 3 简单分析
    将Android系统源码导入ecplise
    Scrum三大角色特点
  • 原文地址:https://www.cnblogs.com/Dillonh/p/9502448.html
Copyright © 2011-2022 走看看