锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
瑙f硶錛?br />瀵逛簬榪欑rank綾伙紝鍒ゆ柇鏄惁鐩哥瓑灝辨槸鍒ゆ柇鍦ㄦ鏁頒箣鍓嶅ぇ浜庤繖涓暟瀛楃殑鏁板瓧涓暟銆佺瓑浜庤繖涓暟瀛楃殑鏁板瓧涓暟浠ュ強灝忎簬榪欎釜鏁板瓧鐨勬暟瀛椾釜鏁版槸鍚﹀潎鐩哥瓑銆傛帴涓嬫潵鐨勮繃紼嬪氨綾諱技KMP鐨勫尮閰嶄簡銆?br />鍙﹀錛孠MP nxt鏁扮粍鏈川鏄渶闀垮悗緙=鏈闀垮墠緙錛?span style="color: red;">鍚屾椂瑕佹眰鍚庣紑涓嶈兘涓烘暣涓瓧絎︿覆銆傚ソ涔呬笉鍐橩MP錛岀珶鐒剁姱浜嗕釜緋婃秱鐨勪簨鎯咃紝nxt鏁扮粍閲岀畻鍑烘潵绔熺劧鏄?,2,3,4.銆傘傛棤璇?br />
浠g爜錛?br />
2 Problem: 3167 User: yzhw
3 Memory: 24496K Time: 813MS
4 Language: GCC Result: Accepted
5
6 Source Code
7
8 # include <stdio.h>
9 # include <string.h>
10 # define N 100005
11 # define M 30
12 int n,k,s;
13 int cal1[N][M],cal2[N][M],nxt[N],d1[N],d2[N];
14 int equal(int *e1,int *s1,int *e2,int *s2,int val1,int val2)
15 {
16 if(e1[val1-1]-s1[val1-1]==e2[val2-1]-s2[val2-1]&&
17 (e1[val1]-e1[val1-1])-(s1[val1]-s1[val1-1])==(e2[val2]-e2[val2-1])-(s2[val2]-s2[val2-1])&&
18 (e1[s]-e1[val1])-(s1[s]-s1[val1])==(e2[s]-e2[val2])-(s2[s]-s2[val2]))
19 return 1;
20 else return 0;
21 }
22 int main()
23 {
24 int i,t,j,p,total=0;
25 //freopen("cpattern.9.in","r",stdin);
26 //freopen("ans.txt","w",stdout);
27
28 scanf("%d%d%d",&n,&k,&s);
29 memset(cal1,0,sizeof(cal1));
30 memset(cal2,0,sizeof(cal2));
31 for(i=1;i<=n;i++)
32 {
33 scanf("%d",&t);
34 d2[i]=t;
35 //cal2[i][t]++;
36 for(j=1;j<=s;j++)
37 cal2[i][j]+=cal2[i-1][j];
38 for(j=t;j<=s;j++)
39 cal2[i][j]++;
40
41 }
42 for(i=1;i<=k;i++)
43 {
44 scanf("%d",&t);
45 d1[i]=t;
46 //cal1[i][t]++;
47 for(j=1;j<=s;j++)
48 cal1[i][j]+=cal1[i-1][j];
49 for(j=t;j<=s;j++)
50 cal1[i][j]++;
51 }
52 nxt[1]=0;
53 for(i=2;i<=k;i++)
54 {
55 p=nxt[i-1];
56 while(p&&!equal(cal1[p+1],cal1[0],cal1[i],cal1[i-p-1],d1[p+1],d1[i]))
57 p=nxt[p];
58 if(equal(cal1[p+1],cal1[0],cal1[i],cal1[i-p-1],d1[p+1],d1[i])) nxt[i]=p+1;
59 else nxt[i]=0;
60 }
61 p=0;
62 for(i=1;i<=n;i++)
63 {
64 while(p&&!equal(cal1[p+1],cal1[0],cal2[i],cal2[i-p-1],d1[p+1],d2[i])) p=nxt[p];
65 if(equal(cal1[p+1],cal1[0],cal2[i],cal2[i-p-1],d1[p+1],d2[i])) p++;
66 if(p==k)
67 {
68 total++;
69 p=nxt[p];
70 }
71 }
72 printf("%d\n",total);
73 p=0;
74 for(i=1;i<=n;i++)
75 {
76 while(p&&!equal(cal1[p+1],cal1[0],cal2[i],cal2[i-p-1],d1[p+1],d2[i])) p=nxt[p];
77 if(equal(cal1[p+1],cal1[0],cal2[i],cal2[i-p-1],d1[p+1],d2[i])) p++;
78 if(p==k)
79 {
80 printf("%d\n",i-k+1);
81 p=nxt[p];
82 }
83 }
84 return 0;
85 }
86
87
]]>
]]>
a-z錛氭爣鍑嗗瓧絎?br>閫氶厤絎?錛屼唬琛ㄤ換鎰忎竴涓瓧絎?br>*錛氫唬琛?涓垨澶氫釜瀛楃
鍏堢粰鍑簄涓ā鏉夸覆錛宮涓瓧絎︿覆錛岄棶姣忎釜瀛楃涓插垎鍒尮閰嶉偅鍑犱釜妯℃澘涓?br>n<=1e6,m<=1e2錛宻trlen<20
瑙f硶錛?br>鐢╰rie鏍戞瀯寤烘ā鏉夸覆錛岀劧鍚庡啀dfs鏉ュ尮閰?br>搴斾負妯℃澘涓蹭腑鏈夐噸澶嶄覆錛屼竴涓畝鍗曠殑鏂規硶鏄紝寮杈熶竴涓摼琛ㄧ┖闂達紝閾炬帴姣忎釜妯℃澘涓茬殑鏈妭鐐?br>鐒跺悗鍒ゆ柇姣忎釜瀛楃涓叉椂DFS涓嬈★紝灝嗚兘鍒拌揪鐨勫熬閮ㄨ妭鐐瑰仛涓爣璁幫紝鐒跺悗鏍規嵁涔嬪墠璁板綍鐨勯摼琛ㄦ壂涓閬嶅氨鐭ラ亾鍒拌揪榪囧摢浜涙ā鏉夸覆鐨勬牴鑺傜偣錛堝尮閰嶄簡鍝簺妯℃澘涓詫級
DFS鐨勬椂鍊欒娉ㄦ剰涓嬪嚑鐐癸細
1銆佺姸鎬佽瀹氾細(鑺傜偣緙栧彿銆佸綋鍓嶅瓧絎︿覆浣嶇疆)
2銆佸鏋滃綋鍓嶈妭鐐逛腑瀛樺湪'?"鐨勮漿縐昏礬寰勶紝鍒欒漿縐昏繃鍘?br>3銆佸鏋滃綋鍓嶈妭鐐瑰瓨鍦?*'鐨勮漿縐昏礬寰勶紝鏋氫婦*鍖歸厤鐨勯暱搴︼紝鐒跺悗杞Щ
鎬誨鏉傚害1e7宸﹀彸銆傘傘備笉鐭ラ亾鏈変粈涔堝ソ鐨勬柟娉曪紝鎴戠殑紼嬪簭C++璺戜簡400MS銆傘傘備笉綆楀揩鐨勩傘?br>
鍙﹀錛岃繖棰樺緩璁敤鍔ㄦ佸唴瀛樺垎閰嶏紝鎴戝紑濮嬪紑浜?00W鐨刡uffer錛岀珶鐒禡LE銆傘傘傘?br>浠g爜錛?br>
# include <cstdio>
2
# include <cstring>
3
# include <cstdlib>
4
5
using namespace std;
6
struct node
7

{
8
node *nxt[28];
9
bool in;
10
node()
11
{
12
memset(nxt,NULL,sizeof(nxt));
13
in=false;
14
}
15
}*ans[100005],head;
16
char map[255];
17
int c=1;
18
node* insert(char *str)
19

{
20
node *p=&head;
21
for(int i=0;str[i]!='\0';i++)
22
{
23
if(p->nxt[map[str[i]]]==NULL)
24
p->nxt[map[str[i]]]=new node();
25
p=p->nxt[map[str[i]]];
26
}
27
return p;
28
}
29
void match(node *p,char *str)
30

{
31
if(!p) return;
32
if(*str=='\0')
33
{
34
p->in=true;
35
match(p->nxt[27],str);
36
}
37
else
38
{
39
match(p->nxt[map[*str]],str+1);
40
match(p->nxt[26],str+1);
41
for(int i=0;i<=strlen(str);i++)
42
match(p->nxt[27],str+i);
43
}
44
}
45
int main()
46

{
47
int n,m;
48
for(int i='a';i<='z';i++)
49
map[i]=i-'a';
50
map['?']=26;
51
map['*']=27;
52
scanf("%d%d",&n,&m);
53
for(int i=0;i<n;i++)
54
{
55
char str[10];
56
scanf("%s",str);
57
ans[i]=insert(str);
58
}
59
for(int i=0;i<m;i++)
60
{
61
for(int j=0;j<n;j++) ans[j]->in=false;
62
char str[128];
63
scanf("%s",str);
64
match(&head,str);
65
bool flag=false;
66
for(int j=0;j<n;j++)
67
if(ans[j]->in)
68
{
69
flag=true;
70
printf("%d ",j);
71
}
72
if(flag) printf("\n");
73
else printf("Not match\n");
74
}
75
// system("pause");
76
return 0;
77
}
78
]]>
瑙f硶錛?br>鏋勯爐rie鍥撅紝鐒跺悗DP姹傞暱搴︿負m鐨勫悎娉曚覆涓暟
浠ュ墠楂樼簿搴﹂兘闈爅ava錛岃繖嬈℃墜鍐欙紝鍚勭閿欒銆傘傘傚攭銆傘?br>
浠g爜錛?br>
2 # include <cstring>
3 using namespace std;
4 struct BigInteger
5 {
6 int bit[100];
7 bool init;
8 BigInteger()
9 {
10 memset(bit,0,sizeof(bit));
11 init=true;
12 }
13 BigInteger operator+(const BigInteger &pos)
14 {
15 BigInteger res;
16 res.init=init;
17 for(int i=0;i<99;i++)
18 {
19 res.bit[i]+=bit[i]+pos.bit[i];
20 res.bit[i+1]+=res.bit[i]/10;
21 res.bit[i]%=10;
22 }
23 return res;
24 }
25 void print()
26 {
27 int i;
28 for(i=99;i>0&&!bit[i];i--);
29 for(int j=i;j>=0;j--)
30 cout<<bit[j];
31 cout<<endl;
32 }
33 };
34 struct node
35 {
36 node *nxt[51],*pre;
37 bool end;
38 void clear()
39 {
40 memset(nxt,NULL,sizeof(nxt));
41 end=false;
42 pre=NULL;
43 }
44 node()
45 {
46 clear();
47 }
48 }buffer[200];
49 int map[255];
50 int c=1,n,m,num;
51 void insert(char *str)
52 {
53 node *p=buffer;
54 for(int i=0;str[i]!='\0';i++)
55 {
56 if(!(p->nxt[map[str[i]]]))
57 p->nxt[map[str[i]]]=&buffer[c++];
58 p=p->nxt[map[str[i]]];
59 }
60 p->end=true;
61 }
62 void make_per()
63 {
64 int s=-1,e=-1;
65 node *q[200];
66 node *p=buffer;
67 for(int i=0;i<n;i++)
68 if(p->nxt[i])
69 {
70 p->nxt[i]->pre=p;
71 q[++e]=p->nxt[i];
72 }
73 else
74 p->nxt[i]=p;
75 while(s!=e)
76 {
77 p=q[++s];
78 for(int i=0;i<n;i++)
79 {
80 node *pre=p->pre;
81 while(pre->nxt[i]==NULL) pre=pre->pre;
82 if(p->nxt[i])
83 {
84 p->nxt[i]->pre=pre->nxt[i];
85 p->nxt[i]->end=(p->nxt[i]->pre->end||p->nxt[i]->end);
86 q[++e]=p->nxt[i];
87 }
88 else
89 p->nxt[i]=pre->nxt[i];
90 }
91 }
92 }
93 BigInteger dp[200][55],zero,one;
94 BigInteger solve(int s,node *p)
95 {
96 if(p->end) return zero;
97 else if(s==m) return one;
98 else if(!(dp[p-buffer][s].init)) return dp[p-buffer][s];
99 else
100 {
101 dp[p-buffer][s].init=false;
102 for(int i=0;i<n;i++)
103 {
104 dp[p-buffer][s]=dp[p-buffer][s]+solve(s+1,p->nxt[i]);
105 }
106 return dp[p-buffer][s];
107 }
108
109 }
110 int main()
111 {
112 cin>>n>>m>>num;
113 char str[128];
114 cin>>str;
115 int tc=0;
116 for(int i=0;str[i]!='\0';i++)
117 map[str[i]]=tc++;
118 while(num--)
119 {
120 cin>>str;
121 insert(str);
122 }
123 make_per();
124 one.bit[0]=1;;
125 solve(0,buffer);
126 dp[0][0].print();
127 return 0;
128
129 }
]]>
]]>
]]>
瑙f硶錛?br>瀛楃涓瞙ash錛屾垜鐢ㄧ殑寮哄ぇ鏃犳瘮鐨凧ava鐨凥ashMap錛岄潪甯哥粰鍔涳綖
浠g爜錛?br>
2 import java.util.*;
3 public class Main {
4
5 /**
6 * @param args
7 */
8 public static void main(String[] args) throws IOException{
9 BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
10 HashMap<String,Integer> refer=new HashMap<String,Integer>();
11 int cal[]=new int[20001];
12 while(true)
13 {
14 String tmp[]=in.readLine().split(" ");
15 if(Integer.parseInt(tmp[0])==0&&Integer.parseInt(tmp[1])==0) break;
16 int n=Integer.parseInt(tmp[0]);
17 refer.clear();
18 for(int i=0;i<n;i++)
19 {
20 String str=in.readLine();
21 if(refer.containsKey(str)) refer.put(str,refer.get(str)+1);
22 else refer.put(str, 1);
23 }
24 Arrays.fill(cal,0);
25 for(int i:refer.values())
26 cal[i]++;
27 for(int i=1;i<=n;i++)
28 System.out.println(cal[i]);
29
30 }
31
32 }
33
34 }
]]>
鍔犱笂浜屽垎鐨勫鏉傚害錛屾誨鏉傚害涓簅(n3logn)
姝hВ搴旇鏄敤鍚庣紑鏁扮粍+浜屽垎銆傚皢鎵鏈夊師涓插拰鍘熶覆鐨勫弽涓茶繛鎺ヨ搗鏉ヨ綆楀悗緙鏁扮粍錛屼簩鍒嗗瓙涓查暱搴︼紝鐒跺悗鐢╤eight鏁扮粍鍒嗙被鏉ラ獙璇併傘傚鏉傚害o(n2logn)
浠g爜錛?br>
# include <cstdio>
2
# include <cstring>
3
using namespace std;
4
char str[101][105];
5
int n;
6
void strreverse(char *str)
7

{
8
int len=strlen(str);
9
for(int i=0;i<len/2;i++)
10
{
11
char tmp=str[i];
12
str[i]=str[len-1-i];
13
str[len-1-i]=tmp;
14
}
15
}
16
bool chk(int len,int pos)
17

{
18
for(int s=0;s+len<=strlen(str[pos]);s++)
19
{
20
char tmp=str[pos][s+len];
21
bool flag=true;
22
str[pos][s+len]='\0';
23
for(int j=0;j<n;j++)
24
{
25
if(strstr(str[j],str[pos]+s)) continue;
26
else
27
{
28
strreverse(str[pos]+s);
29
char *p=strstr(str[j],str[pos]+s);
30
strreverse(str[pos]+s);
31
if(!p)
32
{
33
flag=false;
34
break;
35
}
36
}
37
}
38
str[pos][s+len]=tmp;
39
if(flag) return true;
40
41
}
42
return false;
43
}
44
int main()
45

{
46
int test;
47
scanf("%d",&test);
48
while(test--)
49
{
50
int s=0,e=0xfffffff,pos;
51
scanf("%d",&n);
52
for(int i=0;i<n;i++)
53
{
54
scanf("%s",str[i]);
55
if(strlen(str[i])<e) e=strlen(str[i]),pos=i;
56
}
57
while(s<=e)
58
{
59
int mid=(s+e)>>1;
60
if(chk(mid,pos)) s=mid+1;
61
else e=mid-1;
62
}
63
printf("%d\n",s-1);
64
}
65
return 0;
66
}
67
68
]]>
]]>
瑙f硶錛?br>絎竴闂紝鐢ㄧ粡鍏哥殑姹備覆鐨勬渶灝忚〃紺虹殑綆楁硶灝卞彲浠ヤ簡銆?br>絎簩闂紝鍒╃敤KMP綆楁硶鍓嶇紑鏁扮粍鐨勬ц川錛屽嵆鏈澶у悗緙絳変簬鏈闀垮墠緙鐨勪綅緗備粠鏈灝忚〃紺猴紙鏈澶ц〃紺猴級鐨勪綅緗紑濮嬭綆梟ext鍑芥暟錛屽皢start+len-1浣嶇疆浣滃悎娉曟爣蹇楋紝璁$畻nxt鏁扮粍鐨勬椂鍊欓『渚胯綆楁爣璁幫紙涓嶢C鑷姩鏈烘柟娉曠浉鍚岋級錛岀劧鍚庣粺璁℃爣璁頒釜鏁板嵆鍙綖
浠g爜錛氾紙GCC錛?br>
2 # include <stdio.h>
3 # include <stdbool.h>
4 char str[2050000];
5 int pre[2050000];
6 bool end[2050000];
7 int maxpos(int len)
8 {
9 int p1=0,p2=1,l=0,i;
10 while(p1<len&&p2<len&&l<len)
11 {
12 int cmp=str[p1+l]-str[p2+l];
13 if(!cmp)
14 l++;
15 else
16 {
17 if(cmp<0) p1+=l+1;
18 else p2+=l+1;
19 l=0;
20 p2+=(p2==p1);
21 }
22 }
23 return p1<p2?p1:p2;
24 }
25 int minpos(int len)
26 {
27 int p1=0,p2=1,l=0,i;
28 while(p1<len&&p2<len&&l<len)
29 {
30 int cmp=str[p1+l]-str[p2+l];
31 if(!cmp)
32 l++;
33 else
34 {
35 if(cmp>0) p1+=l+1;
36 else p2+=l+1;
37 l=0;
38 p2+=(p2==p1);
39 }
40 }
41 return p1<p2?p1:p2;
42 }
43 int gettimes(int start,int len)
44 {
45 int p,res=0;
46 memset(end,0,sizeof(end));
47 end[start+len-1]=1;
48 pre[start]=start-1;
49 for(p=start+1;p<2*len-1;p++)
50 {
51 pre[p]=pre[p-1];
52 while(pre[p]!=start-1&&str[pre[p]+1]!=str[p]) pre[p]=pre[pre[p]];
53 if(str[pre[p]+1]==str[p]) pre[p]++;
54 if(pre[p]!=start-1&&!end[p]) end[p]=end[pre[p]];
55 res+=end[p];
56 }
57 return res;
58 }
59 int main()
60 {
61 while(gets(str))
62 {
63 int len=strlen(str),i;
64 for(i=len;i<2*len-1;i++) str[i]=str[i-len];
65 str[2*len-1]='\0';
66 int p1=minpos(len);
67 int t1=gettimes(p1,len);
68 printf("%d %d ",p1+1,t1);
69 p1=maxpos(len);
70 t1=gettimes(p1,len);
71 printf("%d %d\n",p1+1,t1);
72 }
73 return 0;
74 }
75
]]>
2 {
3 int i = 0, j = 1, k = 0,t;
4 while (i < l && j < l && k < l)//鎵句笉鍒版瘮瀹冭繕灝忕殑 鎴栬?nbsp;瀹屽叏鍖歸厤
5 {
6 t = s[(i+k)%l] - s[(j+k)%l];
7 //if (s[(i+k) >= l ? i+k-l : i+k] == s[(j+k) >= l ? j+k-l : j+k])
8 if (t == 0)
9 k++;//鐩哥瓑鐨勮瘽,媯嫻嬮暱搴﹀姞1
10 else
11 {
12 if (t > 0)//澶т簬鐨勮瘽,s[i]涓洪鐨勮偗瀹氫笉鏄渶灝忚〃紺?鏈澶ц〃紺哄氨鏀?lt;
13 i += k + 1;
14 else
15 j += k + 1;
16 if (i == j)
17 j++;
18 k = 0;
19 }
20 }
21 return min(i,j);
22 }
2 public class Main {
3 static int minpos(String str)
4 {
5 int p1=0,p2=1,len=0;
6 while(p1<str.length()&&p2<str.length()&&len<str.length())
7 {
8 int res=str.charAt((p1+len)%str.length())-str.charAt((p2+len)%str.length());
9 if(res==0)
10 len++;
11 else
12 {
13 if(res>0) p1+=len+1;//濡傛灉鏄渶澶ц〃紺猴紝鍒檖2+=len+1錛屼笅闈害鍙?/span>
14 else p2+=len+1;
15 len=0;
16 p2=p2+(p1==p2?1:0);
17 }
18 }
19 return Math.min(p1, p2)+1;
20 }
21 public static void main(String[] args) throws IOException{
22 BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
23 int test=Integer.parseInt(in.readLine());
24 while((test--)!=0)
25 System.out.println(minpos(in.readLine()));
26 }
27
28 }
29
]]>