CCF201409-3字符串匹配(KMP)

 1 #include<iostream>
 2 #include<vector>
 3 using namespace std;
 4 char str[101][101];
 5 char T[101];
 6 void NEXT(const string&T, vector<int>&next){//按模式串生成vector,next(T.size())
 7     next[0] = -1;
 8     for (int i = 1; i<T.size(); i++){
 9         int j = next[i - 1];
10         while (j >= 0 && T[i - 1] != T[j]) j = next[j];//递推计算
11         if (j >= 0 &&  T[i - 1] == T[j]) next[i] = j + 1;
12         else next[i] = 0;
13     }
14 }
15 
16 char toBig(char a){
17     if(a>='a'&&a<='z'){
18         a+=('A'-'a');
19     }
20     return a;
21 }
22 int FIND_KMP(const string&S, const string&T,int n){
23     //利用模式串T的next函数求T在主串S中是否出现的KMP算法
24     //其中T非空,
25     vector<int>next(T.size());
26     NEXT(T, next);
27     int index, count = 0;
28     for (index = 0; index<S.size(); ++index){
29         int pos = 0;
30         int iter = index;
31         while (pos<T.size() && iter<S.size()){
32            if(n==0){//不分大小写 
33                 if(toBig(S[iter])== toBig(T[pos])){ ++iter; ++pos; }
34              else{
35                 if (pos == 0) ++iter;
36                 else pos = next[pos - 1] + 1;
37             }
38            }else{//区分大小写 
39                    if (S[iter] == T[pos]){ ++iter; ++pos; }
40                  else{
41                 if (pos == 0) ++iter;
42                 else pos = next[pos - 1] + 1;
43             }
44            }
45         }
46         if (pos == T.size() && (iter - index) == T.size())// ++count;
47         {
48         count=1;
49         break;
50         }
51     }
52     return count;
53 }
54  
55 int main()
56 {
57     int n,i,m;
58     cin >> T;
59     cin>>n>>m;
60     for(i=0;i<m;i++){
61         cin>>str[i];
62     }
63     for(i=0;i<m;i++){
64         if(FIND_KMP(str[i], T,n))
65             cout<<str[i]<<endl;
66     }
67     return 0;
68 }
问题描述
  给出一个字符串和多行文字,在这些文字中找到字符串出现的那些行。你的程序还需支持大小写敏感选项:当选项打开时,表示同一个字母的大写和小写看作不同的字符;当选项关闭时,表示同一个字母的大写和小写看作相同的字符。
输入格式
  输入的第一行包含一个字符串S,由大小写英文字母组成。
  第二行包含一个数字,表示大小写敏感的选项,当数字为0时表示大小写不敏感,当数字为1时表示大小写敏感。
  第三行包含一个整数n,表示给出的文字的行数。
  接下来n行,每行包含一个字符串,字符串由大小写英文字母组成,不含空格和其他字符。
输出格式
  输出多行,每行包含一个字符串,按出现的顺序依次给出那些包含了字符串S的行。
样例输入
Hello
1
5
HelloWorld
HiHiHelloHiHi
GrepIsAGreatTool
HELLO
HELLOisNOTHello
样例输出
HelloWorld
HiHiHelloHiHi
HELLOisNOTHello
样例说明
  在上面的样例中,第四个字符串虽然也是Hello,但是大小写不正确。如果将输入的第二行改为0,则第四个字符串应该输出。
评测用例规模与约定
  1<=n<=100,每个字符串的长度不超过100。
 
在KMP原型代码上做了修改,本题就是对KMP很直接的一个考察。
posted @ 2017-11-03 19:02  双鱼水天一线  阅读(205)  评论(0编辑  收藏  举报