- 在线时间
- 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>
9 i- _7 v& H% a7 `1 @3 a< >[[/hide]</P>#include <iostream>& U) f6 b* y2 w7 H4 N) i
#include <fstream>
' g; p2 L3 B' \3 p; vusing namespace std;, L1 Z! ], O8 u+ Q+ N3 v, P1 Q
ifstream in("input.txt");, C: h. ~% o% S8 A6 z" V( `/ i9 K2 t) a
ofstream out("output.txt");
% k; w3 d& W5 |( vclass String( c& d9 a2 V3 O) i: _
{ u# m' f( J% M- b2 v4 ^; o* |
public:0 u: t8 U3 E& j# k* w) Y, n
String(char *s="");5 _: T; K( X+ R6 c5 P2 x
String(const String& s);
+ n# i/ l4 V, k- \) S( Z R% ` ~String();
9 u ~$ S( {0 \; y8 E! Q: J, A int Length() const;
5 Z+ T' y/ b' ~2 [: A; ~ int ReadString();8 O" T/ g# h0 M5 G: ~( H
int Rs();
: N# c" y" O' C# B void Prefix();3 y( w2 v0 H. P% N5 A2 h) [
void ModifiedPrefix();" G5 V2 o" q2 b' r& {
int Match(int i,String& t);
6 R/ p+ X6 k) x3 ^% h private:
# v. b8 ?& Z1 f- v char *str;: c- |0 n6 B3 y$ G; A. G
int *pre;0 u/ d- j. ~. a0 ? Q
int size;
! N# `- f( {, |& f6 V0 p* @};4 r) j5 S- e; g1 z# w
String::String(char *s)' o. R! @, m9 g3 ^) Z9 E
{4 [/ |9 A0 f- O: _: M. x; g
size=strlen(s)+1;5 _6 s5 M; Q; s& o) |$ t9 J
str=new char[size];
; Y$ C* Y$ o+ ~$ Q if(str==0)
& f* I! A! s$ X' u: ]" J# o throw "error";# j+ i0 |; H8 D( f6 m" r
strcpy(str,s);
3 }$ |! e8 n9 `6 r( ^' t pre=new int[size];
! u6 n3 Q3 X5 ^ if(pre==0)
, Y: c: J1 h2 l0 a( L, r throw "error";
/ o+ x! C2 m! J5 z+ Z$ ]( z- N}1 b) F, m, _2 [, [
String::String(const String& s)
6 t& y" i+ X0 b. W" w' v* G- \" f{6 W5 \/ d7 E* d$ L1 D0 F" ]
size=s.size;0 S) I0 s# ^) @8 ~: L
str=new char [size]; V3 l& H5 N. Z6 G3 h; }
if(str==0)) l# p+ S% D( z' D
throw "error";
3 z( E& A' N- i strcpy(str,s.str);
5 L6 G9 v: h* p$ `) o4 a: e pre=new int [size];
8 ?* f A1 S# Z) B if(pre==0)
4 v7 J' m+ z8 o9 x' t' P throw "error";
( z# [ j2 a: e+ b% O}1 q1 r8 o; p8 l. ~% Y- u
String::~String()! J+ C5 e7 c. x5 r
{' n4 M+ c; E+ @" M$ C% F8 Z
delete [] str;% _. w* B, T6 U) k2 G2 m$ g
delete [] pre;
2 j% Y$ L0 d4 L; o* z}& x6 \$ `0 H' ^9 B! i
int String: ength() const$ G+ c3 C# L( n" f, n; B4 A: s
{
, q$ l% I4 Q. H$ B return size-1;7 l" W9 L( p' x- z
}& n" ], M) U+ S# @% G
int String::ReadString()
9 d" g# v2 i! P2 T) R0 M{3 }! H z9 _. A# B% X. n1 U0 ?1 [" q
char tmp[256];, t9 a& p8 g. u. ~) O
if(in>>tmp)
% g+ I$ f/ S" D/ \1 C' d {
7 S: ^ z3 N K% [ delete [] str;
+ p& _+ V. s0 s size=strlen(tmp)+1;9 } u; j- @" ~1 r1 b' w" ?+ P Z
str=new char [size];4 ?! |2 w% s, O7 f4 s
strcpy(str,tmp);
; q/ u$ ?4 X, ]" M/ n @' z return size-1;
6 P; j$ X4 ^& w1 M6 [# v- b }& H+ d5 n" g3 @$ ^. g) A1 d1 ?
else
' W$ x" b+ ~/ Z( Q return -1;
" T. X a/ z7 m) ]3 K& S7 K}
! s, M: E t, v: j) O6 x# w: nint String::Rs()! ^5 z( A4 y' A- w9 p
{
7 L/ ~8 d; Q! z+ z* e5 ^ char tmp[256],c;
7 z: ]+ d3 `$ Z/ E+ w `/ N int i=0;
) K1 y1 S# | O5 Q while(in>>c)
: @# d: Z8 F. p- G {" }( R# a/ h/ I2 ]0 N6 b
if(c!='*')
3 q. p7 ]8 g# }: I7 b tmp[i++]=c;
$ f6 P7 u- P% ^ else if(c=='*'&&i>0)
* W4 E! c. N3 l5 G+ P K6 w& P break;" P- p5 l# h! Z
}7 |1 l3 m/ @: c! X5 E5 N% x) }$ h
if(i>0)* _, b7 b) _* V. s5 y5 d& B5 ^
{
" s5 t3 M" R; y7 Y2 Z delete [] str;0 a* Y" x% U! S4 y
size=i+1;
4 p0 D2 c* \, L1 n str=new char[size];$ U$ Y* B( @( X
if(str==0)
" N4 W$ C' w: Q) O( j! w7 r9 g2 U' {- j throw "error";! Z4 \ O( i9 b4 }1 y
for(i=0;i<size-1;i++): ?: V5 Q* |+ e0 u# T s3 ~% a
str=tmp;
* n( |4 w8 T2 q* M/ u, C8 }3 Q0 u return size-1;
; R) [, `7 m2 \* x }3 h) c0 S* N5 m/ O, Z; R5 b
else% N5 S$ N, t& \& J5 j, ]( G
return -1;% v& ^7 p H5 k, _( Z
}. W* u; p9 \( R/ a1 a
void String: refix()
* _; k! |2 D9 s& m{
8 u9 E4 V9 U- X' W- V( e& T int m=Length();
8 q* @ M5 G7 y delete [] pre;0 H7 {9 M! H+ {2 V1 t& I
pre=new int [m+1];% P7 i2 e' ~4 O3 |4 P1 }+ ^
pre[1]=0;% y2 _$ u9 E/ h2 g) a! k
int k=0;+ I% b% ^: V8 P
for(int i=2;i<=m;i++)* X+ `; x( E5 }, W' a2 L8 b5 r- R9 z
{) u% k: t) o4 O! M8 h! |3 |* y' f9 e
while((*(str+i-1)!=*(str+k))&&(k>0))& z3 J( G* ]5 r n5 n
k=pre[k];
) y" ~1 f8 M1 t" T+ y if(*(str+i-1)==*(str+k))5 r S2 H, ?7 F
pre=++k;
) E0 Y* u2 ~9 ^6 S; l. r8 W! p' p else
/ T+ @' y$ d$ b8 z, R pre=0;
- N, B$ G8 I$ u0 V }3 H% K, n( T3 d
}& N5 h1 r4 _8 |
void String::ModifiedPrefix()" K1 s( q7 {% g, {
{4 [9 R) W" `4 l+ q P- s4 N( K# R2 U
int *f;
! L, ~; s' N9 q8 n# y$ }# s) S int m=Length();8 }3 l7 b5 ]4 m" T: h1 H: P& {
f=new int[m+1];
( r( K4 d5 C# U$ v7 Q Prefix();
! _, r& P3 B! `8 o4 H' B: N for(int i=1;i<=m;i++)' u! u2 W) S2 {3 w3 M
{
; f6 c0 t- L* |2 E0 p" m f=pre;
% P" k( D3 t ]$ [; G } v( T4 R, K4 }9 y) @
for(i=1;i<m;i++)
~6 ?3 w+ E6 R/ B2 q {, W: S, V2 x2 u% W( C+ r
int k=f;
f8 }% c, H+ V% [; O* z if((k==0)||(*(str+i)!=*(str+k)))
# r) ^/ w& w# `6 k [; D. h4 I pre=k;
; o8 J: u; U( P5 G else 7 ^, u% g" N+ I# s( Z: c& X
pre=pre[k];
! i! c B4 o# e+ Y }& H4 {* N9 \2 u1 z- J
delete []f;1 E3 I& q: n* d- E2 z
}( }$ O$ q$ E6 M1 M0 }
int String::Match(int i,String& t)
; w5 q4 A1 |3 @# } W( f% |3 h- O* A{
/ v6 l1 H9 @4 q. _ int j=0;
+ u3 l9 m# ` l9 R. N8 r9 g int n=Length(),m=t.Length();3 }& I+ o' U3 C( H/ q2 L8 T5 m
t.ModifiedPrefix();
: o: X \" B- k! d% G2 c' b while((i<=n)&&(j<m))
. q; P. r: j/ X o5 ] if(str[i-1]==t.str[j])
2 E& ?4 M% V8 r& u0 Q8 G, p {
$ e7 n4 z, f! `3 D i++;
; f0 \/ p5 c8 F w' [1 L j++;
1 o8 s' _4 D, |4 F, B" q3 r* M% K/ C }
, `1 S! w* Z& ^0 K else " }. Y5 [+ K8 X: K7 {& n1 ^
if(j==0)5 y2 ^- D) R" e c2 K
i++;
: R) I/ c- B1 o! Q+ b else
$ g1 y$ W, q" z; x) d! b; P- |2 x7 E! M j=t.pre[j];( R; }7 {* }' @/ S9 L
if(j<m)
' }/ M7 r8 Y$ V% `3 n return 0;: u' P6 V; a* C% I( e6 L
else
[) v% a, C% Z" E% v return i-1;1 t/ W7 p, O5 V+ P! ]( \
}
. l* G) O" E1 i5 j/ Pint main()
/ A( J. @1 l3 g0 n{! ~" s$ d& ]- _" c' i% }. T' d
if(in.fail())1 S+ a0 w8 s( P+ g
{
* l& s( u# }' y; \; k( ~& c7 p9 W cout<<"the input.txt is not exist!";
; R4 d2 t! z$ h exit(1);}- f- k( S/ r5 X$ s! D+ T4 r* I
int i=1;
% e1 V [0 ]: d, w: `8 w, I String s,t;) C6 M$ ^# b" J+ X0 C
s.ReadString();4 a" T9 W% U. U3 Z) x& f P7 c$ A8 N
while(t.Rs()+1)
2 r2 \6 j) Q8 }1 v3 G {
0 ]1 Q. ]. i' d1 l' J: R8 n' x i=s.Match(i,t);$ E" i/ E. W6 W
if(!i)
1 e% t4 z) I* [: o8 b# L' E! `. G {& d( [+ O3 r9 ~ P F
out<<"No"<<endl;
3 x8 D7 @) a; N; T2 M2 T; E, S+ M$ ?% @ break;+ R8 @+ u/ R N" c
}
$ v: e8 X( v. y- e& x }
8 U& w1 K$ r5 ^5 t9 h if(i)
0 H$ w# q$ E+ l/ Q out<<"Yes"<<endl;
) q* c3 H0 u- n2 O& k* q5 L- { return 0;% @ y' L$ F$ e5 V# s4 y" P
} |
zan
|