• E. Expenditure Reduction(用链式前向星存储下一个字符a在s中的位置)


    Problem - E - Codeforces

    题意:

    菜单可以看作是一个只包含小写英文字母和数字的字符串S,俊平认为餐厅的核心特色是一个字符串F,它目前是S的一个子序列。Junpei要求你从S中找出满足要求的最短子串S′。

    对于那些可能对子序列和子串的定义感到好奇的人,请考虑两个非空字符串A,B。

    如果我们说A是B的子序列,我们可以找到一组|A|指数{ik},其中1≤i1 如果我们说A是B的一个子串,我们可以从B中抹去一个(可能是空的)前缀和一个(可能是空的)后缀,得到A。
    输入
    第一行包含一个整数T(1≤T≤104),表示测试案例的数量。

    对于每个测试用例,有一行包含两个字符串S,F(1≤|S|≤105,1≤|F|≤100),用一个空格隔开。保证F是S的一个子序列,两个字符串都只包含小写英文字母('a'到'z')和数字('0'到'9')。

    保证T案例的∑|S|不超过5×105。

    输出
    对于每个测试案例,在一行中打印一个字符串,表示包含F的S的最短子串。

    如果有多个答案,打印其中任何一个。

    题解:

    用链式前向星存储下一个字符a在s中的位置

    我们设nex[i][a]为在i这个位置要寻找字符a的话,我们最近应该跳到那个位置上。

    1. #include<iostream>
    2. #include<cstring>
    3. using namespace std;
    4. char s[100050],f[105];
    5. int ne[100050][40];
    6. int l,r;
    7. int find(char c)
    8. {
    9. if(c>='0'&&c<='9')
    10. {
    11. return c-'0';
    12. }
    13. else
    14. {
    15. return c - 'a'+10;
    16. }
    17. }
    18. void solve()
    19. {
    20. cin >> s+1>>f+1;
    21. int n = strlen(s+1);
    22. int m = strlen(f+1);
    23. for(int i = 1;i <= n;i++)
    24. {
    25. for(int j = 0;j < 40;j++)
    26. ne[i][j] = -1;
    27. }
    28. for(int i = n-1;i >= 1;i--)
    29. {
    30. for(int j = 0;j < 40;j++)
    31. {
    32. ne[i][j] = ne[i+1][j];
    33. }
    34. ne[i][find(s[i+1])] = i + 1;
    35. }
    36. int mi = 1e9;
    37. l = 1,r = n;
    38. for(int i = 1,now;i <= n;i++)
    39. {
    40. if(s[i]!=f[1])
    41. {
    42. continue;
    43. }
    44. now = i;
    45. for(int j = 2;j <= m;j++)
    46. {
    47. if(ne[now][find(f[j])] == -1)
    48. return ;
    49. now = ne[now][find(f[j])];
    50. }
    51. if(mi>now-i+1)
    52. {
    53. r = now;
    54. l = i;
    55. mi = now - i+1;
    56. }
    57. }
    58. }
    59. int main()
    60. {
    61. int t;
    62. cin >> t;
    63. while(t--)
    64. {
    65. solve();
    66. for(int i = l;i <= r;i++)
    67. cout<<s[i];
    68. cout<<"\n";
    69. }
    70. }

  • 相关阅读:
    MybatisPlus多表连接查询一对多分页查询数据
    [附源码]Python计算机毕业设计Django求职招聘网站
    linux知识复习1-dup dup2
    LeetCode 383 赎金信
    java计算机毕业设计商场会员管理系统源码+系统+数据库+lw文档+mybatis+运行部署
    Flink有哪些功能组件
    qnx shell sh ,linux shell bash
    PlantUML 绘图
    JDBC,Java连接数据库
    Postman API测试工具的使用
  • 原文地址:https://blog.csdn.net/m0_64158084/article/details/127656750