- 在线时间
- 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>
8 F" ]) ?( F( D! e( o) e. N k" S< >[[/hide]</P>#include <iostream>$ {5 U& @8 @# i# j, W6 z1 N; L0 a
#include <fstream>
+ X( ^! d+ C- p4 {' t: |& Cusing namespace std;
7 k& j' b3 k4 G& h+ Tifstream in("input.txt");
8 Y0 b- W7 G: \2 H0 Tofstream out("output.txt");
3 M4 D0 ~1 n U9 F; i! R. Bclass String
) [1 D2 J0 z6 M! b* Q{
0 h/ o- h& F' T public:
! ~+ Z( \. ]" \) x) e" f String(char *s="");
8 ?: g T2 n" b$ U9 x0 h: d String(const String& s);
6 p1 P6 F% r3 @9 a ~String();
8 r2 z J9 o _6 @: v/ b int Length() const;
5 B5 X) R" b. T8 W$ f, d int ReadString();0 }' T6 S1 U5 h
int Rs();
; U; \- `+ B) U3 T6 b$ L void Prefix();
) z" F/ C* j' D; U4 X& K4 @ void ModifiedPrefix();0 P/ `) Z3 M7 t: g: n' B& [
int Match(int i,String& t);- R$ {9 u: j5 l5 |' H
private:9 Y ~6 ?9 A* _6 T/ d
char *str;
0 p" U8 @& R Q5 w, a int *pre;
, r6 l/ C, E8 w, _6 [: U* X( C0 b int size;# v9 X; D% P9 E; c: n5 J' m
};
$ O5 e) d+ H' J2 C% f0 j4 m; n; h7 nString::String(char *s)
0 A- }' ^' a# }: P{
$ T I- u1 z* S0 _6 C6 @ size=strlen(s)+1;
\ t6 A- _8 n4 y x% z0 E str=new char[size];
9 i% K0 O" m6 \, G6 A* ] if(str==0); D+ {# c+ w g- E7 ?4 s
throw "error";" t7 b* E7 G* O2 Z
strcpy(str,s);0 p8 ~% e/ B- ]6 L- E1 p+ a
pre=new int[size];0 |3 t R& q) ]' U: G& `
if(pre==0)
& m. y1 a5 i8 H5 q2 K* o& i% P; e throw "error";8 u5 ?. X9 J! O3 Z/ V7 J/ X6 Z( k
}
) F; y j D+ h: i7 PString::String(const String& s)7 t9 Z4 m. i* X O9 ~- Q7 x
{
6 U( a) j! t6 _" n size=s.size;
# i2 P9 Z, T$ y/ Z$ R7 A str=new char [size];1 a& G- q& B. S: B1 c0 r4 y
if(str==0)0 I+ Q4 Y& H7 C: E
throw "error";# |8 n) p. t7 J% L# P7 I
strcpy(str,s.str);
3 M; s8 _7 p! P9 X+ r3 u# w pre=new int [size];$ B9 e3 Q1 }# l9 {0 E. @
if(pre==0)# I6 o3 q9 [4 {0 P6 f0 f2 R
throw "error";
, w: l. r) Y" U/ g( W4 [+ W} W# r4 F( m. m, K8 ]% W
String::~String()
7 f* e% S% w8 c% i# t0 D{9 p2 ?; S& s: C6 K# j
delete [] str;
) |/ D7 H. Z* x& i8 | delete [] pre;( M8 ~$ I" j9 t! z& \' z4 A
}' }" G4 p7 m* P; H2 E! e2 `
int String: ength() const
4 T% e' h. l) d( _) I k3 t$ U0 L{3 O' V& j, J+ n0 I3 p
return size-1;
4 g q- \/ K) P* s9 G. S}; f$ _4 s6 G/ Y- H$ _4 o
int String::ReadString(), L$ ]$ t2 ?0 u1 ~. J
{
* B: M* W: U/ w2 } char tmp[256];
! g! U( o% a; W* c& X- | if(in>>tmp)" h( r6 w0 N9 S4 C2 K4 i9 ~) a8 p9 v
{( p! x& l/ g! [
delete [] str;# y# N1 o8 V: C [; j; r
size=strlen(tmp)+1;2 ]; `) g6 K/ m6 f
str=new char [size];- ?+ F6 H' }% ]/ o- f- N& Z
strcpy(str,tmp);( [% V- \; R1 `( ]6 k* N
return size-1;8 o6 X; e+ x+ X" g5 {
}
# T3 C! E2 z2 K else1 L/ O# b; H3 N+ S: t$ z
return -1;
8 n) V/ I* k9 u8 k1 a3 s' j}8 U# M& c) v; I5 I4 ?
int String::Rs()
r C# F' i# j2 q/ I5 x( G{
0 ^; g* s8 M3 ~. q' R7 ] char tmp[256],c;' k( G% P& a+ p$ @
int i=0;
, W) t! D- U- h' L) } while(in>>c) U4 }& `. J7 Z, ~
{
% X, F/ l9 y* Q, F if(c!='*')
% D" Z0 k! R2 v6 N: G" Z4 | tmp[i++]=c;4 T" u0 Z# G# Y! T
else if(c=='*'&&i>0)
4 s% b# n# S! @, V$ t break;4 r+ u! s {. s
}3 g& s0 I E! D9 M+ v9 M" @* h
if(i>0)
9 E& s; F; e( w) Z7 B7 n; S7 L {
, B x2 t) ]( X* u+ x" I+ ]% O delete [] str;
1 q: S+ y$ T0 Z9 q' d size=i+1;6 k( p. x( ~2 x0 V6 D3 `
str=new char[size];$ c- }2 J# z7 E! L! ^$ s R
if(str==0)" l; [/ p! b1 e3 s( S
throw "error";
( R0 {, L, ?5 o% t J$ M for(i=0;i<size-1;i++)7 l, M, w H0 T
str=tmp;
- ?" t: t& [& T$ s" P8 K" o2 r return size-1;. c) E x4 n6 Q
}
% _3 y+ g: V0 Y7 i1 {. g else
( [) L$ a& y) [$ M) |% L3 r0 Q% q return -1;' I1 |5 D0 ^) f' Y: r0 {2 x
}2 D4 s3 P5 x5 y/ { m4 e; j, `2 _9 i
void String: refix()8 Y, w2 U8 l! L# P7 o4 T: t
{2 _9 ~) }3 H$ ]+ R, X# P
int m=Length();
; y1 G3 G: I' |2 F& n4 |+ n delete [] pre;
, J7 _7 O: v( \/ Z1 ^6 L6 z pre=new int [m+1];
5 u) l; \. T; O3 E1 s pre[1]=0;
) b5 W5 \4 u @ int k=0;
$ K- ?/ S; g5 E) b0 j for(int i=2;i<=m;i++)
a- I' Z0 v" b s& q g9 s {1 b- o0 P: h! ?
while((*(str+i-1)!=*(str+k))&&(k>0))0 b) B0 T3 `0 y/ I7 v$ w7 Z
k=pre[k];
; j9 u& o1 t* b9 s if(*(str+i-1)==*(str+k))$ w) d; o# ?$ \3 L
pre=++k;
, V" z4 ?9 l% c0 h0 [& Y6 U0 l else W: w5 F, N( p& d' N5 d
pre=0;9 Q* A8 A! [! E* X( l* {
}/ w d. n) C8 Z! ]4 v# d7 Y
}
_* v' q# ], ?void String::ModifiedPrefix()( D( ?5 c+ W6 r3 H/ o$ w
{# F0 k' i& Q8 I, V$ B9 j2 W
int *f;
+ f+ E" }% t' w& L8 y int m=Length();
- |0 Z- r. Q' l0 l- u2 Q f=new int[m+1];
: `# ^/ y5 p' X' [# f ^: R Prefix();
2 g4 Q% x7 Y- B; e5 Z6 q. D" @ for(int i=1;i<=m;i++) X- E4 [$ ~8 @& | j
{
- L0 s# K3 R! W; F f=pre;
2 O( ^4 r! S4 L) S' N }8 c: ^6 H0 P6 q; ]4 w4 f$ e
for(i=1;i<m;i++)
! ~7 E+ j" r( ^ {
% h0 u% G, r2 r. L int k=f;
1 Z- N6 p% P- H5 S- b if((k==0)||(*(str+i)!=*(str+k)))
* |! P* g! D9 i+ ]5 v pre=k;# A( \1 n. f4 G' h
else
7 a# A' l% c+ E, y7 c* V0 _6 x$ @* w9 P2 R( W pre=pre[k];
: K8 e5 ~9 o. e; i }
' r! u, X0 x1 Z0 M1 {* | delete []f;
; ]# h+ K9 k" O1 T! c3 q}7 o5 ^; H% B! J# _# N. g* l: y& S
int String::Match(int i,String& t)
* z( |7 m* m& C3 Y& K& t{
' J+ Z& l, x5 p4 H, [$ H int j=0;
4 G2 W* T$ B0 W8 j! s* ?. S' v int n=Length(),m=t.Length();* D0 S" P) F2 P: K4 `1 z" R4 x
t.ModifiedPrefix();
( F' Z3 a1 \: a [ while((i<=n)&&(j<m)), u7 K- a* Y8 ~$ d3 s
if(str[i-1]==t.str[j]), ]: P: x- L5 T$ b0 @
{
: g# Z$ x3 G0 y! Y! H i++;
5 q- ^) G/ v% s$ [( _ j++;
* n- h+ {/ G- @% R% @ }
6 C6 f( p' i4 ^ else ) c" r4 A5 u# J% w) V3 U
if(j==0)
9 V% E% `2 h3 N3 A/ k i++;% E/ Z, n! L/ y2 w% T8 |4 I
else
3 m) ?6 }2 v }2 p j=t.pre[j];
. Y0 F, F2 Y8 k* W3 Y0 h2 ] if(j<m)
' d8 c/ R, `' X4 T, @' e# C return 0;
' ^2 i; _$ j0 X" l& O, w else
% q& Q$ ?2 }1 w, a return i-1;6 o6 h7 O. o1 b+ W* b2 W
}5 ?7 Q. b7 o1 ?; n% `! y9 m
int main()
; z m! a1 N( T ^3 P O# W/ V{1 {; }6 Y% I: N" f/ }, A
if(in.fail())
8 W! ~- `3 _9 G& T {
. D# e0 {$ k% M( z2 l2 Z7 [ cout<<"the input.txt is not exist!"; G8 H% X. j' K& _2 L; U! E
exit(1);}
0 ^ ]! d- K7 Y% N7 l4 J7 K int i=1; w( k9 N! O3 ^1 A
String s,t;! c% C5 G2 q8 [: D; t2 _4 u
s.ReadString();
# b) `" F9 d+ t- f6 e' F while(t.Rs()+1)
' U+ U+ N! c! \) h+ f0 i {
/ |( s" ~/ k' s( Y i=s.Match(i,t);
* c- \/ [ t2 Y. [ if(!i)8 B% E g7 i" C/ Q2 F
{
1 F: h9 G2 r+ Q7 ~) n! |, l" b out<<"No"<<endl;
( }* f4 Z0 V: B, v+ B) b break;
& O! N# \7 y7 V b4 o }
9 V0 s0 a+ ~* h; E0 G }- f ^+ I( c, M. z8 J# t/ k
if(i)6 ~" E0 u, @- N/ N0 h0 {
out<<"Yes"<<endl;
; U' l2 ?# K' v, l# p. j/ _ return 0;; _5 Z3 ^3 Y& Z; x3 k
} |
zan
|