- 在线时间
- 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>6 ]8 M& ^5 L8 b; y) z& ^
< >[[/hide]</P>#include <iostream>
% E: c6 S7 ]/ n' |+ M' ?6 {#include <fstream>
0 w8 F l3 g% k0 J( @* ~using namespace std;
; r) j9 \1 G; eifstream in("input.txt");. |( u) v9 B4 n1 \! Q. G! r# M4 o* ^
ofstream out("output.txt");
: u! a8 n4 d; Z8 Oclass String& Q; Z3 d; p4 o' j5 R" [) o9 B
{
# r) ^0 B. G. { H public:1 F- [9 `& f0 s8 |5 U. L. P& q
String(char *s="");0 N( ]7 p U) m8 a% q
String(const String& s);
, {) b5 e$ Q+ J ~String();5 ^3 U1 a1 s7 d
int Length() const;# s! A) f" P) H! M1 i
int ReadString();
7 D8 K5 `6 [' d- t' v0 G) L' R int Rs();& H, x/ J6 e: n: u" F7 b$ [
void Prefix();: i# [! V' Z6 {3 ~0 G1 {& v
void ModifiedPrefix();
+ D8 G X& t% H9 C int Match(int i,String& t);
( w1 `7 D7 {2 J* g8 d private:$ W7 T8 r2 K/ c( p/ k
char *str;& ~. I! {! u" }# v
int *pre;
$ f( _1 X, b% B7 h2 C+ ? int size;
- ~( ]& V: Z4 \ Q+ t$ Z};
" q+ m, T- k7 QString::String(char *s)3 E. `: U( V' d/ u t
{
7 z, O) o$ [/ T p8 @5 d$ T: ? size=strlen(s)+1;
8 ?+ A( i$ k5 J! }; f) e. f str=new char[size];
' u% o! s. K" U \/ Y if(str==0)2 w r/ E) `- J
throw "error";
& P. R" B7 ]. q) W& K5 t3 C strcpy(str,s);
) x; [# O1 \2 L& `0 D: Q- [ pre=new int[size];
' X4 Q6 `0 Z j5 s if(pre==0)
( |* v0 Z% x Y throw "error";" W/ x+ l6 T7 t# F' m$ s& G- B
}
8 W% @7 o( Z" [7 v% m) V" V0 GString::String(const String& s)
+ q" G! \- P5 ]: t) c X* W{
1 c* D" b8 M3 _1 V4 S+ d1 Q size=s.size;9 p: z1 z) _% K X
str=new char [size];
9 d( K! b# ]# j9 l7 j6 u/ \7 O if(str==0)
8 a! h( F+ k+ p! U3 B* V, i. s throw "error";# i" G% P3 k$ l0 w) q$ m/ A8 ~
strcpy(str,s.str);) B- m5 A7 Q( R! U5 [4 O
pre=new int [size];
2 ^3 i2 g5 ?9 D: A( [' `/ [ if(pre==0)
9 v% C9 [9 Q1 [- R! U$ n1 j( n throw "error";; f$ U0 ^& h% M0 H* g
}
& [; n( d3 M4 C- l- H' N5 {# JString::~String()
! W5 v' e7 m3 i. m4 F9 Z{
% u+ ~, y+ D. V6 ~ delete [] str;
$ ^ I6 y& G8 T delete [] pre;/ T0 v$ @& f# `# P1 N
}
5 ]& T' g' _, J! w D7 [6 fint String: ength() const9 H; p2 Y) \( d" X
{
7 a1 O: F# }! w7 h% j5 Y# O2 U9 Q return size-1;
3 R s5 I/ H* E9 v) Z! j8 r+ l}* r0 q% F9 o$ r
int String::ReadString()0 J! Z) N5 R/ E
{% `: ?/ Z4 `( P* w
char tmp[256];9 p$ ^( V9 T7 P% O9 Y2 E) H
if(in>>tmp)' a' y& a* }: Z! }8 m" Y
{! L$ C1 ?& j$ E5 e) e+ ^
delete [] str;4 s# I$ ]# g7 S
size=strlen(tmp)+1;) P5 f2 {5 W+ k) k; A$ c2 ?& E1 Q
str=new char [size];+ f6 U1 N1 k# ~0 V% p H
strcpy(str,tmp);# A& Y4 n4 W5 b `# v
return size-1;# w5 \% Q% s+ r* S% [
}
- Y) }; G3 j0 H: ` else0 p( G9 J# @: J- I; Z6 E+ g8 Q! D
return -1;* O: \: m, U9 J/ D& |, b A! C
}9 |' U9 b: V3 `7 g7 L2 \, \* R
int String::Rs(); Y w8 j0 S" i' |- E# A
{4 d4 ]4 y$ X! c# {! ]3 b3 ~7 a
char tmp[256],c;* W- S7 ~4 @: t1 [) N) _: _
int i=0; n9 z5 r) R! R) S* U! @6 d: ?
while(in>>c)
& m) u0 Y# J2 D {
( s0 ^0 ~6 G7 ~3 v+ G: u6 E if(c!='*')3 U* s( t) j8 O/ g9 d
tmp[i++]=c;
$ p% z n% J8 O. a; H* S/ G3 H else if(c=='*'&&i>0); S6 p6 m1 @+ G
break;7 ^6 F& f, o9 p# ?, H- d! u
}- L6 o1 z6 F; d1 M- c
if(i>0)
: H3 E* Q! J9 U% M: b& B {
% z' K4 c% |2 {: m9 ^+ T7 J delete [] str;7 R* U2 e0 \* s9 T0 f# k3 \
size=i+1;6 @' f( }0 ]2 z/ y
str=new char[size];
4 `) N& f4 G9 W* _8 h/ D if(str==0)
/ x# j P9 X1 B! [ throw "error";
. ^' T: T ~. u! g3 ~ for(i=0;i<size-1;i++)
! k& Z! E! @! e7 | str=tmp; : l6 k! m, b: o& O( ]) V9 \. z
return size-1;
+ x) d! B- m7 N* | O }
" F- x; ?/ z2 \5 X4 r/ i7 Z7 L else) M) y( h9 j/ Z2 e
return -1;
! R, {+ N- ^( l5 M. x/ k {}5 w8 l8 P7 `3 o0 C3 d# Q
void String: refix()
% q$ |' v* C' r1 I+ g, ~- L{7 F z# F' h7 V1 ?" z4 s
int m=Length();
1 K" ]& z4 L" O delete [] pre;
8 B* @% Z3 Q" F! a* [ pre=new int [m+1];
# j/ d3 M2 G* g2 L J q1 W pre[1]=0;7 h' m8 B$ c7 z
int k=0;
& _6 v# r+ A- V for(int i=2;i<=m;i++)6 [. ^! ?6 }1 Q7 K5 F; y6 G8 ~
{
2 u6 w# k# ~) W$ m7 d+ Y5 z* i8 w6 U while((*(str+i-1)!=*(str+k))&&(k>0))% G* n: t: d/ T% e( r
k=pre[k];
% f% u0 @9 P2 E& A$ ^# J$ b1 j+ { if(*(str+i-1)==*(str+k))& Y* |0 i2 K4 N" z+ V5 R! ]3 \
pre=++k;) S1 x( |0 K, X" }0 P4 O
else, i: M4 M) l5 n, A( E+ f2 z- b+ A
pre=0;
" O) f% R5 A1 M4 Y. Q; A% C$ D }& y7 E. h, q0 ~5 p8 I9 U5 j
}5 d; X& Z4 r! {3 t7 v* @( ]
void String::ModifiedPrefix()$ n; @# }* H. j9 Y7 ]+ b% X# i
{
! `4 I- z+ J- O# M; h int *f;) e0 ^7 A; W5 V. _8 F& H0 p" Y
int m=Length();
/ h: N7 b) f8 }* R% h( Q6 _ f=new int[m+1];
* |) [! v# v$ [6 p+ e Prefix();
c( r) [8 N, Z+ ]1 `- P for(int i=1;i<=m;i++)
' M" N, l/ C- S* p Q2 d {
/ L; j; _2 q9 ^- C3 U# r5 p; j& D f=pre;
( b/ L7 i8 F' Q" I. H }) X; O% c) {5 |
for(i=1;i<m;i++)
, E6 m: w" v' Y& j. K* z {: T3 g3 v4 l1 q( g! x
int k=f;1 j# P O; l& Q/ \: I
if((k==0)||(*(str+i)!=*(str+k)))% Y, v: y6 b4 s0 O6 W
pre=k;
$ ] y6 L) W/ C8 u( P else c% D! S/ G: V% l3 X
pre=pre[k];
% ^ o. ?1 G2 A0 x, {8 P* o' q }
. D% v* a& o) n) p7 G delete []f;
5 d' J5 l8 k$ e2 u3 a. ^4 _/ U" Y}4 O" I ]) D7 x7 d2 s7 [/ S
int String::Match(int i,String& t)
$ Y j6 }' s5 \9 I7 r2 W" ]& `{
! A# v1 f1 k2 E: J0 {$ ~ int j=0;
# z& Y9 M. a) L+ x int n=Length(),m=t.Length();) l' `; ?, T2 s' l0 w8 T7 n, I
t.ModifiedPrefix();' U; ~/ j& c( q' n- Z; e' y7 p
while((i<=n)&&(j<m))# {" ~! e; y4 M( U! v/ X5 N
if(str[i-1]==t.str[j])
! j: m0 f! P' d1 H9 o7 p$ m {
; q+ x" D: w( c& i! D! y8 u i++;" V, ?7 ~ m* J3 J
j++;5 a' n6 ` Q. J$ c$ Z! L5 o& J
}% y" D+ j' N' e$ y7 u
else
4 E5 o& T. A/ m7 w if(j==0)" b# A$ ^4 Y. s o# f0 i7 A/ E% p
i++;. V! B/ L1 x, M4 G! P; V
else
8 d+ r0 r3 {" {. E- Q$ B& z3 y* m j=t.pre[j];
! q) Y* A- v( Z. `; O6 J if(j<m)# v7 g/ \; A9 s7 q2 f& ~8 f
return 0;: ?$ A0 K. M8 b! Q; w. o
else
2 ?' G+ G7 i8 D' M" H% n9 b/ n return i-1;
5 q' D: Z( x; L}
0 @+ t ~" B0 _+ w) e" Jint main()' O0 H$ [- T& d: B, G7 A) a' M, Q
{
) G2 B% L6 i; N# y# L) D/ l; o if(in.fail())2 ^, R# d" N& F' r7 h
{- i5 M; a5 {. q5 A5 R
cout<<"the input.txt is not exist!";
) e( m+ z, G+ i$ G# Y6 r5 x% M exit(1);}
j0 P# U& `1 S# O* c, ~ int i=1;
1 c. K' L4 j: u2 _1 X String s,t;
) i/ ]8 Z& i$ P; F9 d9 J; B. [ s.ReadString();
0 g. I t( S0 U* B3 L( S while(t.Rs()+1)& p- n0 D* ~- I
{* x0 H7 L7 `8 |" W5 P
i=s.Match(i,t);' a5 y: w! ~& L. U% }. P
if(!i)( W# C. h) A/ P! E1 Z4 | z
{
1 q; z& @- q. W out<<"No"<<endl;
# e- T+ Z2 D4 a: R2 e break;6 U5 q( Q5 s f5 O* F
}2 A: o2 x9 T( x g) n
}1 _, q7 k8 P" W: k
if(i)
- u+ B7 b7 E- r& j7 B8 Y0 A out<<"Yes"<<endl;
( a% P7 q6 }1 ]+ u return 0;
% U2 {3 z, h, f1 z% }& k} |
zan
|