- 在线时间
- 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>
4 q* k2 S* @) Y' p2 N< >[[/hide]</P>#include <iostream>3 @- `7 ~( O% j" c: C! n
#include <fstream>
* Z: C& v, [; C0 c3 P& ^' N/ fusing namespace std;
7 e- d2 M/ g) H2 i1 Vifstream in("input.txt"); X$ P& P( s, \* _9 s0 }1 b2 e
ofstream out("output.txt");% s3 P; K0 r3 x G: o; l
class String
! Q9 h8 ]5 a; `% K8 C/ ]1 W{
5 ~! E/ R% L `+ t# B1 ^ public:
3 C3 M% u& N6 L String(char *s="");
, H8 f) r8 Y+ h; I String(const String& s);. w9 |8 |# n3 S. V3 M; _
~String();
# t4 G0 W6 G/ n: d7 V0 n int Length() const;, U4 H" [5 k0 x
int ReadString();, j1 F% q9 y- v2 H6 a9 U' p% J
int Rs();+ L" n: |% \- J
void Prefix();
! W& ]; F* E3 P7 A1 \ void ModifiedPrefix();
0 _' p2 A5 I5 j% a# Y0 \9 u int Match(int i,String& t);
+ w+ }, L" J" C) H$ L private:
+ [* [* f0 H! f+ }- Z# R char *str;
) w5 _" p& B+ h |' s int *pre;
- n% A4 x) B5 L4 r0 R7 s5 H int size;. r' d8 w$ t7 A% q2 \. c8 H
};' O1 R) H& g: {$ f
String::String(char *s)5 M8 O' {4 [# G/ v4 E; S
{3 X! R, W, ]# e( d4 z3 t, A: T
size=strlen(s)+1;
2 a# m! J0 ~. b str=new char[size];4 y9 F$ Z' j! u$ ?( \9 z0 K1 E
if(str==0)
% b$ b5 l( @6 |7 C9 _, h; @. P throw "error";
; {4 }% F8 L/ V& p! M3 P& B strcpy(str,s);
! R/ G5 _# F2 D pre=new int[size];
& H8 v, Q8 q3 I( P( \ if(pre==0)
, B( s# f/ g5 }5 i) q$ c2 | throw "error";
( e) n+ [0 H9 V6 s# i/ y}5 h0 o t5 U5 v. R- [' t
String::String(const String& s)
1 F4 Q6 X/ b* A& _$ y{
4 d4 @7 I8 Q, A6 O size=s.size;
! h1 \8 f3 A5 x a% S# M4 F9 r& J str=new char [size];
( O4 n( D1 X/ L& K+ X d( O4 ^ if(str==0), M# I9 j8 ~% R/ J7 K) J/ E
throw "error";
5 r4 d3 O4 ^! `3 U0 m strcpy(str,s.str);
& @. n6 M0 v( [: @& a pre=new int [size];
. Y t }. _" _ if(pre==0); k6 U4 P7 p# ?& \
throw "error";
S1 n A( h! u/ R8 R# {8 p! d" ^}
7 c, }& m; u# u0 M# o% _- PString::~String()
1 _9 s5 W) \; [, M6 R0 {{* n% G. v6 D' g# ?4 [# \
delete [] str;9 R1 O* F* P" l# i# F1 Y, c
delete [] pre;
& d+ {* T1 w3 o3 t" `0 |) O( q, _}" ^+ L! J2 a- E% s" `
int String: ength() const; ]2 f+ r, y+ g/ x: s
{6 S% O: |8 Z9 i" y: O. t
return size-1;
1 f6 S) h: T5 n" O}* o' a* o% R! q
int String::ReadString()
W/ k6 S7 W: F8 m{. v# c5 F; H D3 q+ z, K3 F
char tmp[256];
! s) H, l/ \; a( \# S5 {! \0 o if(in>>tmp)
. }: i7 _+ h% v2 g9 \ q {
+ F; j! U8 f) l) ?6 h delete [] str;
0 c7 c/ w8 I: Z/ o2 @ size=strlen(tmp)+1;; G, c, U. C( h! f3 n& p
str=new char [size];
' J& o8 W7 f% ~ strcpy(str,tmp);
, i- C d. y5 t2 H return size-1;1 }" r; R0 P7 Z
}
9 f- W. K. N& f/ j) | else
" Z- f$ ~' F# d5 | return -1; I/ i E8 h/ v- \# }
}6 m) A6 C" l( ^( J6 N
int String::Rs()3 y* Q8 m. g' ]8 X/ H- ~
{+ b( b3 _2 A# y8 |. i' g4 S/ y
char tmp[256],c;; L6 M/ p; p4 Q( H6 f3 Y
int i=0;
- z9 H7 [* Z8 _9 q/ C while(in>>c) t& X2 O! l! p; }7 a
{
& z3 }/ e: ]0 R* q if(c!='*')2 \+ o9 I8 E7 G; q$ U6 F* D
tmp[i++]=c;
9 a& n8 l- n2 u5 g, o else if(c=='*'&&i>0)
I0 q- y) j* \( C' j break;
& d$ U# ~2 T, @" @ }
, n7 n& Z" B1 {) r: ]. @ if(i>0)2 P/ h" J d, P: j' j% K. ?8 k& o
{, U4 K1 \: e& N N" {5 f G; v
delete [] str;$ m0 q) G7 K! ^% e5 o" `8 X |
size=i+1;- O3 J9 f6 p: {5 t% C
str=new char[size];
, f' S/ {/ G4 I* L: ^ if(str==0)# j* I6 v% {# J2 ` j
throw "error";
! V+ E( e/ V& \" F' q. r! u v for(i=0;i<size-1;i++)
+ e/ A% k: w0 O9 h5 D' u& z str=tmp; $ X1 T% q( A4 U- j, D3 p: {+ K9 d
return size-1;
) _" u' T' ]" f* R0 b! V0 T! h3 \ }
$ t$ ^' ]5 T! F8 w' M# `! ~6 }/ B. A else( U( d" z, D1 n" G5 t2 j
return -1;
\& M) \2 s( A' b}
5 F$ n/ _& T: C3 V; M% T, p" Hvoid String: refix()6 @% v. T. T' D9 M5 [; V# U
{
[1 o" O2 U$ A: c3 n: w int m=Length();4 w% u1 a* t, b) n
delete [] pre;* g. G: M% K8 K* P+ t
pre=new int [m+1];
8 Y, l2 w0 m& c/ I2 r4 |7 n; k+ w pre[1]=0;- J1 `% A( s+ j9 Q6 q
int k=0;. f* ^1 R+ p' c; o% t: z+ c
for(int i=2;i<=m;i++)
' s! I3 f0 ?, B3 v( o% H* E {( Y0 R% t! \3 U/ Z$ i) q
while((*(str+i-1)!=*(str+k))&&(k>0))
* ]" d& S, d @- a9 D k=pre[k];1 J# `8 T4 Q5 E+ @2 B
if(*(str+i-1)==*(str+k))6 v) ^0 }$ M$ O' w5 m( f
pre=++k;8 T; e O3 o% V- v0 j
else
9 S4 i: X; {2 \# w# n. d$ \ pre=0;8 o3 ~+ A# p3 d( v% u) D
}- J6 @* H4 ^1 ^8 Y
}- k/ {, I: M, [4 u
void String::ModifiedPrefix(): L) l8 b2 S _9 a) I. `' M
{
# O5 }0 a/ l. X4 I: s- i; b int *f;
% r8 u- Q$ F& ]7 E int m=Length();* Q* Q0 I r9 \: S$ W5 Q4 W
f=new int[m+1];
2 k3 f" s2 A5 h) R Prefix(); o5 O" t2 @6 n0 F5 I# H. q
for(int i=1;i<=m;i++)+ @! ` u; O7 W$ E q
{# v5 a: Q* V: l. S- ]# Q
f=pre;/ e; ]$ u: f# Y# R
}
1 ~ ?0 U7 E2 `! U W9 Y for(i=1;i<m;i++)
9 ?5 w, o8 w4 [9 c4 N/ T; c {
5 L Z# p* H" q; Y, F int k=f;
; k8 F+ e: o4 y3 q if((k==0)||(*(str+i)!=*(str+k)))
9 @1 d& I. J4 C+ h) k pre=k;
9 w9 n/ j1 `2 t) h else 7 w% w; b1 {, D- I" {4 e6 r* u
pre=pre[k];/ P% f& p( {0 G/ W+ b
}
0 B+ o7 P- h# D4 X: z% i! v delete []f;
e/ ]: {. F" h* s7 b, i" @}
1 C! ^" d" N8 [+ `' C7 ^) ], }int String::Match(int i,String& t)
; _+ B& Z& g, A" w$ B! M{
. Z# t8 J7 |9 R) X1 R" t int j=0;
) {/ G% y) }9 u5 g. {' ] int n=Length(),m=t.Length();
; u8 m i, \( O B% h8 z$ N t.ModifiedPrefix();
3 r. I: K7 F6 A6 k8 b while((i<=n)&&(j<m))6 i. q1 r+ ~0 c, O) s5 A/ Y
if(str[i-1]==t.str[j]): [8 o: c, S( S8 }* W+ }6 h. P
{+ y" ], X0 a, G2 E2 w, Z
i++;+ p/ \; _. {. I) [, I* k2 l
j++;
6 G; {. k+ a7 m* {0 C4 ^7 C }
7 Y! S; ^- d; M9 M! Q* ^: u else
3 \4 z) U J7 c4 } if(j==0)7 }. _4 w0 c9 b8 I: o
i++;% p5 j. b' |' o/ W; ~2 x* p2 I
else
8 h) M( O1 a% M- _5 m( P j=t.pre[j];6 v5 C) e/ P# v/ P
if(j<m)5 @# Y: R9 S4 v, J4 q. F4 r
return 0;
: n% L, H1 P8 L else
( Y4 W8 Y9 Y4 x$ ]" j return i-1;
9 }7 N' ~1 ~, I/ U- \4 ^* W& }}( f' z4 H7 m1 V5 W, E* Z
int main()
% d# N, v8 H& ?0 k{5 A0 i3 C3 M& y0 @! w- s4 {- K- \# S
if(in.fail())
$ O0 T2 E! J8 C$ g5 m9 l {
; u8 f: D: F; u* J+ Q& U) G* i cout<<"the input.txt is not exist!";
' p6 h6 k% K0 m exit(1);}
7 E+ K1 n7 k" z* o: v6 P int i=1;
8 S) y# P' H. }" ^4 \ String s,t;
3 k" g N* w& E! l s.ReadString();
0 H# d4 C" R- _6 |! c# n while(t.Rs()+1)
9 R/ j `' x9 ?4 e1 w/ x {" Y& P/ y [4 M+ i/ h# \1 H o
i=s.Match(i,t);1 @+ O; J! m5 ]; I' i; E: h, Q: x3 e
if(!i)
" O* c4 S: r8 J6 F J {
. w" Y3 y! ]2 v0 t5 Y. g out<<"No"<<endl;! v7 p7 A+ T- ^( T& ?0 I: F& N
break;* ^, j1 h# R3 \) o* P$ M
}
0 G# y" V" B0 \3 U: i, M0 R* k }
: i+ z# Z ^/ ? if(i)
: C; a+ s `% R% Z out<<"Yes"<<endl;
0 ~+ w5 k+ e% u" D0 I- p. ^ return 0;
. f" c/ u* k: P3 |( R} |
zan
|