- 题目描述:
-
给定一个短字符串(不含空格),再给定若干字符串,在这些字符串中删除所含有的短字符串。
- 输入:
-
输入只有1组数据。
输入一个短字符串(不含空格),再输入若干字符串直到文件结束为止。
- 输出:
-
删除输入的短字符串(不区分大小写)并去掉空格,输出。
- 样例输入:
-
in #include int main() { printf(" Hi "); }
- 样例输出:
-
#clude tma() { prtf("Hi"); }
- 提示:
-
注:将字符串中的In、IN、iN、in删除。
#include <iostream> #include <string.h> using namespace std; const int MAXN=1005; char a[MAXN],b[MAXN]; int lena,lenb; int nex[MAXN]; bool same(char ch1,char ch2) { if('A'<=ch1&&ch1<='Z') ch1+=32; if('A'<=ch2&&ch2<='Z') ch2+=32; return ch1==ch2; } void getnext() { int i=0; int k=-1; nex[0]=-1; while(i<lenb) { if(k==-1||same(b[k],b[i])) { i++; k++; nex[i]=k; } else k=nex[k]; } } int vis[MAXN]; void KMP() { int i=0; int j=0; while(i<lena) { if(j==-1||same(a[i],b[j])) { i++; j++; } else j=nex[j]; if(j==lenb) { int l=i-j; for(int z=l;z<l+lenb;z++) { vis[z]=1; } j=0; } } } int main() { cin>>b; lenb=strlen(b); getnext(); cin.get(); while(cin.getline(a,MAXN)) { lena=strlen(a); memset(vis,0,sizeof(vis)); KMP(); for(int i=0;i<lena;i++) { if(a[i]==' '||vis[i]) continue; cout<<a[i]; } cout<<endl; } return 0; }