【蓝桥杯】算法提高 字符串匹配
问题描述
给出一个字符串和多行文字,在这些文字中找到字符串出现的那些行。你的程序还需支持大小写敏感选项:当选项打开时,表示同一个字母的大写和小写看作不同的字符;当选项关闭时,表示同一个字母的大写和小写看作相同的字符。
输入格式
输入的第一行包含一个字符串S,由大小写英文字母组成。
第二行包含一个数字,表示大小写敏感的选项,当数字为0时表示大小写不敏感,当数字为1时表示大小写敏感。
第三行包含一个整数n,表示给出的文字的行数。
接下来n行,每行包含一个字符串,字符串由大小写英文字母组成,不含空格和其他字符。
第二行包含一个数字,表示大小写敏感的选项,当数字为0时表示大小写不敏感,当数字为1时表示大小写敏感。
第三行包含一个整数n,表示给出的文字的行数。
接下来n行,每行包含一个字符串,字符串由大小写英文字母组成,不含空格和其他字符。
输出格式
输出多行,每行包含一个字符串,按出现的顺序依次给出那些包含了字符串S的行。
1 #include <stdio.h> 2 #include <cstring> 3 #include <string.h> 4 #include <iostream> 5 #define MOD 1000000007 6 #define MAX_COL 9 7 using namespace std; 8 int next[101]; 9 void get(string s){ 10 next[0] = -1; 11 int i=0,j=-1; 12 while(i<s.length()){ 13 if(j<0||s[i]==s[j]){ 14 i++; 15 j++; 16 next[i]=j; 17 }else{ 18 j = next[j]; 19 } 20 } 21 } 22 23 int kmp(string p,string s)//p是模板串,s是子串 24 { 25 get(s); 26 int i=0,j=0; 27 int n=p.length(); 28 int m=s.length(); 29 while(i<n&&j<m) 30 { 31 if(j==-1||p[i]==s[j]) 32 { 33 i++; 34 j++; 35 } 36 else 37 j=next[j]; 38 } 39 if(j>=m)//s串比较完毕 40 return i-m+1; 41 else 42 return -1; 43 } 44 int main(){ 45 //freopen("in.txt","r",stdin); 46 string s; 47 cin>>s; 48 int t ,n ; 49 cin>>t>>n; 50 if(t==1){ 51 for(int tt= 0;tt<n;tt++){ 52 string p; 53 cin>>p; 54 if(kmp(p,s)>=1)cout<<p<<endl; 55 } 56 }else{ 57 for(int tt= 0;tt<n;tt++){ 58 string p; 59 cin>>p; 60 string p1 = p; 61 for(int ij = 0 ;ij<s.length();ij++){ 62 if(s[ij]>='a'&&s[ij]<='z'){ 63 s[ij] = s[ij] -'a'+'A'; 64 } 65 } 66 for(int ij = 0 ;ij<p1.length();ij++){ 67 if(p1[ij]>='a'&&p1[ij]<='z'){ 68 p1[ij] = p1[ij] -'a'+'A'; 69 } 70 } 71 if(kmp(p1,s)>=1)cout<<p<<endl; 72 } 73 } 74 75 return 0; 76 }