- 在线时间
- 0 小时
- 最后登录
- 2005-4-22
- 注册时间
- 2005-4-22
- 听众数
- 2
- 收听数
- 0
- 能力
- 0 分
- 体力
- 72 点
- 威望
- 0 点
- 阅读权限
- 20
- 积分
- 26
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 7
- 主题
- 2
- 精华
- 0
- 分享
- 0
- 好友
- 0
升级   22.11% 该用户从未签到
 |
< >很经典的一道问题,我想大家应该都会,我这次只是想帮助那些还不是很懂得人,还是一样附上解题报告和源代码。觉得好的就顶,主要是用模式串来解决。</P>- [& Q# d, z' x$ A) [: Z
< >[[/hide]</P>#include <iostream>
4 Q- L. J! l4 ]! s) X* Q @#include <fstream>
+ `) \( L& e( \- \, C/ ~using namespace std;# N- O6 j$ n9 `- x. m3 I
ifstream in("input.txt");# Y. l; o' h* h! y9 w0 H/ ]8 E
ofstream out("output.txt");
; F" \2 y% n6 s$ @+ w' Sclass String
8 p0 b' ~) d4 r, ?* M{
% J8 z7 ]$ x: [; ~1 E- u [ public:
5 K% A6 t q/ k) V' ` String(char *s="");
! Q" O) Y0 K1 {/ j) ?0 E String(const String& s);) K* U5 Z% u; H+ U/ X2 U7 L
~String();
* `+ Y9 A4 A$ d9 T# M0 Q9 G int Length() const;
1 b! u, Q- F; E2 t& W int ReadString();* f, |. }9 s* A( ?* k0 p+ y4 G
int Rs();5 I4 u. Q1 U3 ?. }; k
void Prefix();
2 E6 U7 K" R Y( u' { void ModifiedPrefix();
5 v5 h; R& O& y% R9 ] int Match(int i,String& t);
, ?* d& x1 Q) F- P( B# T private:( ~7 j6 Q1 f" C8 T
char *str;7 j) ~4 p2 j: T9 {. q
int *pre;
! j; t9 F3 z2 ? int size;
# z/ R# \3 X1 |2 W$ X};
3 I5 U* D. Q' BString::String(char *s)! R" C0 X/ @) b, V$ U! H ~0 x% H
{
# V8 m$ b* F0 I size=strlen(s)+1;
" z9 P. k. u" C( R& O* ]/ N: w str=new char[size];
$ i3 Y3 W# w1 t! v, B4 ` if(str==0)( S2 Y" c1 N( G5 Y. |' q+ h
throw "error";
! S, Q; {2 X! r4 j8 W; w- x w strcpy(str,s);. r3 d1 r, Z! y# N- \" B* ^
pre=new int[size];
- H+ N2 H* f) ?$ d. D4 j if(pre==0)2 N7 A9 Z- j5 R+ q
throw "error";
6 I5 Z1 I% I! v) d* N8 g}
4 t6 [& e- E- H+ @String::String(const String& s)
+ W. b: X( W+ N8 ~6 i{
* V( I' K" t! S size=s.size;
7 ?! X" E6 L" S6 b6 a8 a8 t4 h str=new char [size];; n" _" R/ b* m9 `( n
if(str==0)7 f" d% R% ]$ G9 `4 G
throw "error";3 U$ u+ i+ Y0 V J
strcpy(str,s.str);1 y8 k4 e( s7 t$ f. u5 ]- d
pre=new int [size];( \* i; t) `6 d2 B/ x
if(pre==0)
/ c# b* M' M( o/ ?3 ~ throw "error";: E2 i [5 T% K4 v/ ~
}
8 u; k; Q4 H ?0 h- v1 t+ H- S5 OString::~String()9 X& v V9 B$ y1 P' l2 Q
{# }' _& r% J: a4 i/ m0 {8 K7 `
delete [] str;+ T6 I! G K% x& e5 r Q5 g
delete [] pre;# Q3 Q6 R8 i3 |2 X# X; D
}* G. F9 s: F/ N; \! Z6 q
int String: ength() const
5 T3 g) y4 ~7 k{" J! d, t# ?9 }
return size-1;7 F0 y# E( w2 D# z; c% X+ M; |8 D
}6 w* T( n$ q. {; n* T
int String::ReadString()+ E2 ^" N% Z, @
{2 |4 z! _. ]: }, x+ w0 }# r
char tmp[256];: c. g g- e7 y& A' e
if(in>>tmp)% r% j# f. g2 G9 x: `
{
9 b# s0 }! k- y2 @ V% w delete [] str;
9 u. ~5 m" o3 z* M' |7 R1 w size=strlen(tmp)+1; ?6 w9 u7 I. Y( m& l& F9 M& c
str=new char [size];) Y' C. }/ B3 L: j0 ?! L% o
strcpy(str,tmp);, x6 n: F& j) [# r0 J/ r, G
return size-1;, I# f4 J6 k, G2 R
}4 e i x2 |0 C5 W/ z
else8 u% F/ ~) F7 Y# j9 d
return -1;
9 z! \6 F+ D0 _2 M7 s6 {: E8 J}$ ^4 A* S0 T3 z$ W
int String::Rs()' p& \5 M9 Y: Z5 G- ]
{& p1 R& l7 T v5 H8 `" j+ C
char tmp[256],c;
) C9 l0 n9 T0 F' t0 N int i=0;
2 s6 W; F$ O* y8 t$ m while(in>>c)& |7 `0 [) N" H+ m' w8 ^7 r
{8 O& F/ d( M8 R z `' V
if(c!='*')
) h* c# a. F1 b9 T! j! ^ tmp[i++]=c;# A( |1 T% g0 Z/ V3 b* J# q9 m
else if(c=='*'&&i>0)% K/ E! O& L3 I' Y( c+ e9 }
break;
; l% v% ^8 ?% P9 O/ Y) ~ z4 @5 b }- p' b5 G3 } X1 |
if(i>0)
+ s8 x6 F+ M- `( M {
, ]5 H- X9 ~" n" g A9 ^( g delete [] str;/ I0 {* }$ r! w* G
size=i+1;
2 R' G6 c5 o8 m str=new char[size];0 `0 Z5 i. z9 e" V; w' q
if(str==0)
+ X% h" O' Y9 H7 T( O2 _9 s throw "error";
1 w) B3 U! `0 e6 S9 C l for(i=0;i<size-1;i++)
: I D2 E% P& f str=tmp; : Q3 G% f2 L/ n* V; d ?: j: S
return size-1;1 S3 V- T: \) p* q3 Q( D
}2 d3 Z! {0 j; l, D
else" k4 E) u! w! [8 e% @8 N# R
return -1;
* l# @8 ^! o. i% O* d}
- s8 `3 V _0 {6 n+ f1 ~, C' Rvoid String: refix()
9 G9 L- C0 w4 S; l{
7 i, A+ M0 i# {: j [/ B int m=Length();
+ h8 _ L7 Y- x+ s delete [] pre;# m) D& p i0 ~# U2 u" t1 p
pre=new int [m+1];& j- o4 P8 I) \( Y$ b4 ?9 ]" ]
pre[1]=0;# s5 H( H2 K3 C: H* y) C
int k=0;
/ p+ L# D" g, m5 U for(int i=2;i<=m;i++)9 q$ `; }/ q) \5 G) |3 P$ p
{( l9 \) l( c' t" x! T/ _
while((*(str+i-1)!=*(str+k))&&(k>0))
& ], p/ _" A5 X) \. D% k k=pre[k];
6 }, S: u* c) ?; J# |+ H if(*(str+i-1)==*(str+k))
6 m( u% P& W- S6 Y% w) P* W pre=++k;
# v1 c* J' p& j5 q else! e% a1 }0 B6 z
pre=0;4 S* z, [3 p* h% x- A
}
# P' x2 m7 _4 W6 e}+ ~" h/ M2 v' e$ @+ b- O* W% c
void String::ModifiedPrefix()
; D' b+ p" N/ x2 `{7 I2 U0 a% j/ g: L+ z- O7 W
int *f;/ w0 e0 |4 j" e ]
int m=Length(); Y7 A. P; C E! l$ U& |
f=new int[m+1];
* q$ \7 ?$ Y- G& H Prefix();
4 a& m; e8 S. _' P7 ]; j; m for(int i=1;i<=m;i++)
) I* n/ R3 V) |! I+ M {
9 d; D( w- y6 R% b2 {/ { f=pre;% |; o/ C& F5 O' ~7 Q {& Y
}
+ T/ @4 `3 F/ k: F+ n( M( ^ for(i=1;i<m;i++)/ g9 z# I4 o5 F
{/ W% z7 q. B3 u
int k=f;. h& O4 Y1 Z0 s
if((k==0)||(*(str+i)!=*(str+k)))
q& R$ k5 H6 D# d pre=k; e( l* }! p& W8 v# U5 `, H
else 5 u' t# z' N* o
pre=pre[k];! t6 E: T. \6 ?9 ]$ Y; W: e+ T
}2 R' W0 i( j, k' y7 f! z
delete []f;
' J& p: y8 @1 c}
8 ?( x# d. n8 dint String::Match(int i,String& t), t6 }2 r+ S# }- e
{, T! q, ~% M) @* e: V# p. c
int j=0;* \: {- K3 l) d1 |" |* t2 W/ h
int n=Length(),m=t.Length();$ O$ b r; ~/ f$ ]0 h, a( r& m
t.ModifiedPrefix();) N- T- m0 H! E8 p# {* n( P
while((i<=n)&&(j<m))
8 a/ {) B! z) h if(str[i-1]==t.str[j])
( P% x+ Z7 q0 @* G, Y! ` {
9 D1 }' i, a) n; H4 Z/ {) { i++;
" R, ^9 W, u) I- ^/ Y j++;
+ c) L% H7 I. ^ }2 |+ x7 f$ `& C( Z, p4 y* y; O
else
1 ~8 d+ j- e1 ` if(j==0)- P/ r/ s9 c, `1 X, K# U/ P
i++;% C/ b+ X N; y, N' i
else
* ?% u2 S3 f1 P4 d# g j=t.pre[j];% A6 R- S+ D+ [/ C
if(j<m)
1 d; H: X( |" n: Q7 m/ n \ return 0;
7 L' W$ D5 z2 [3 i7 }% F7 N else / R' c' v5 j' M5 O+ a2 r( ^3 d
return i-1;
. W7 y: T; L- `: I; u% B& K}8 x$ f% w6 D3 T0 E# y5 [" b
int main()
! ~" U. [2 q! ~) h) q{6 R! n, [3 ^6 L8 e3 s6 R- q( Y% K
if(in.fail())
, @7 j4 B2 |+ [7 {) { {
$ g2 G, K! i& Q# R$ u cout<<"the input.txt is not exist!";2 K7 Q: \1 I+ x3 o% w0 }
exit(1);}
7 Q3 M# M& J. I0 q8 H& K- W, @ int i=1;# _. R- N# \% `
String s,t;
4 J: g! B8 V5 Q" r s.ReadString();4 S, e" }. a- z
while(t.Rs()+1)
- f [' E/ T; k* V1 Z1 u# C4 B2 \! x {
1 N/ l/ f, N% K6 L; F i=s.Match(i,t);8 V# a m! Y5 p# w2 `. w) B
if(!i)
; L, f7 G" q) x9 w" A9 ?0 c( v2 O8 K {
, Z$ p E# c) ]6 a) h/ y3 I out<<"No"<<endl;3 E& c8 c% ]* j. _ D+ H5 c/ C
break;3 ]! W5 _+ Z+ p9 {4 H
}- ]% f$ z" j" z$ _
}% H C" _0 f* [ I+ r& F' \
if(i): `& Y. d4 Z9 ^. V9 z2 j
out<<"Yes"<<endl;( }) r# D w8 ^6 I
return 0;3 X2 { Q/ X3 S/ D: B* T, t
} |
zan
|