| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
来一发KMP模板#include <iostream>
#include <string>
#include <vector>
#include <stdio.h>
#include <cstdlib>
using namespace std;
void buildBorderArray(int *border, string& s) {
int size = s.size();
//cout << s.size() << endl;
//border = new int[s.size() + 1];
border[0] = -1;
for(int i = 0; i < size-1; i++){
int bor = border[i];
while(bor >= 0 && s[i+1] != s[bor + 1]){
bor = border[bor];
}
if(s[i+1] == s[bor + 1]) border[i+1] = bor + 1;
else border[i+1] = -1;
//cout << border[i+1] << endl;
}
}
int searchKmp(string& str, string& pat, int *border){
int patsize = pat.size();
int strsize = str.size();
buildBorderArray(border, pat);
int i = 0, j = 0;
while(i <= strsize - patsize){
while(j < patsize && str[i] == pat[j]){
i++; j++;
//cout << i << " " << j << endl;
}
if(j == patsize) {
return i - patsize;
}
if(j == 0) i++;
else j = border[j-1] + 1;
}
return -1;
}
int main() {
int gs;
while(1){
string s;
getline(cin,s);
gs = atoi(s.c_str());
if(!gs) break;
string occ[15], rep[15];
for(int i = 0; i < gs; i++){
getline(cin, occ[i]);
getline(cin, rep[i]);
}
getline(cin, s);
for(int i = 0; i < gs; i++){
int patsize = occ[i].length();
int *border = new int[patsize + 1];
buildBorderArray(border, occ[i]);
while(1){
int repPlc = searchKmp(s, occ[i], border);
if(repPlc == -1) break;
s = s.substr(0,repPlc) + rep[i] + s.substr(repPlc+patsize);
}
delete [] border;
}
cout << s << endl;
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator