• 题目:自然的谜语


    题目描述

    题目描述
    给出两个字符串 S1、S2,判断 S1 在 S2 中出现了多少次,并输出每次出现的偏移量。

    数据规模
    对于 50% 的数据,S1 和 S2 的长度均小于 100。
    对于 100% 的数据,S1 和 S2 的长度均小于 100000,且 S1 的长度不超过 S2 的长度。

    输入格式

    两个,分别为字符串 S1 和 S2。

    输出格式

    如果 S1 没有在 S2 中出现,则输出“There must be something wrong.”(注意大小写,符号为半角,建议直接复制)。
    如果 S1 在 S2 中出现了,则第一行输出一个数为 S1 在 S2 中出现的次数 n,后跟 n 行,分别为这 n 次出现的偏移量(即 S1 首字母对应于 S2 中的位置)。

    题解:

    原装KMP(串匹配)问题,需要多看,多复习

    代码实现:

    View Code
     1 #include<iostream>
    2 #include<string>
    3 using namespace std;
    4
    5 string s1,s2;int n,pi[100001],b[100001],ans=0;
    6
    7 int main()
    8 {
    9 int i,j,k;int q;
    10 cin>>s1>>s2;
    11
    12 pi[0]=-1;
    13 k=-1;
    14 for(q=1;q<s1.size();q++)
    15 {
    16 while(k>-1&&s1[k+1]!=s1[q])
    17 k=pi[k];
    18 if(s1[k+1]==s1[q])
    19 k++;
    20 pi[q]=k;
    21 }
    22
    23 k=-1;
    24 for(i=0;i<s2.size();i++)
    25 {
    26 while(k>-1&&s1[k+1]!=s2[i])
    27 k=pi[k];
    28 if(s1[k+1]==s2[i])
    29 k++;
    30 if(k==s1.size()-1) {ans++;b[ans]=i-s1.size()+2;k=pi[k];}
    31 }
    32
    33 if(ans==0) {cout<<"There must be something wrong.";return 0;}
    34 cout<<ans<<endl;
    35 for(i=1;i<=ans;i++)
    36 cout<<b[i]<<endl;
    37 system("pause");
    38 return 0;
    39
    40 }
    41
    42
  • 相关阅读:
    selenium+python处理Alert弹窗
    HTML在网页上不能显示图片问题
    制作python程序windows安装包(飞机大战源码)
    python读取ini文件
    python杀死Windows后台程序
    python3中文乱码解决方法
    算法04
    Windows10
    Windows10 快捷键
    文件夹选项-安装功能-window服务
  • 原文地址:https://www.cnblogs.com/noip/p/2331470.html
Copyright © 2020-2023  润新知