返回顶部

KMP

Codeforces 607C:Marbles

题意:

由“NSWE”表示上下左右。然后有两个球在各自坑道的起点。之后由你对两个小球做相同的操作,想让小球往上走就往上走,想往下走就往下走。但是要保证两个小球保持一致的动作,其中一个撞墙的话不用管。问能不能保证两个小球都能从起点到达终点。

solution:

trans+KMP

 1 #pragma warning(disable:4996)  
 2 #include <iostream>  
 3 #include <algorithm>  
 4 #include <cmath>  
 5 #include <vector>  
 6 #include <string>  
 7 #include <cstring>
 8 #include <queue>
 9 #include <map>
10 using namespace std;
11 typedef long long ll;
12  
13 #define INF 0x3fffffff
14  
15 const int maxn = 2e6 + 5;
16  
17 int n, len;
18 int nex[maxn];
19 string a, b;
20 string all;
21  
22 char trans(char x)
23 {
24     if (x == 'N')
25     {
26         return 'S';
27     }
28     else if (x == 'S')
29     {
30         return 'N';
31     }
32     else if (x == 'W')
33     {
34         return 'E';
35     }
36     else if (x == 'E')
37     {
38         return 'W';
39     }
40 }
41  
42 void kmp(string s)
43 {    
44     int i, j;
45     len = s.length();
46  
47     nex[0] = -1;
48     j = -1;
49     for (i = 1; i < len; i++)
50     {
51         while (j != -1 && s[i] != s[j + 1])
52         {
53             j = nex[j];
54         }
55         if (s[i] == s[j + 1])
56             j++;
57         nex[i] = j;
58     }
59 }
60  
61 void input()
62 {
63     cin >> n >> a >> b;
64 }
65  
66 void solve()
67 {
68     n--;
69     
70     reverse(b.begin(), b.end());
71     for(char &c : b)
72         c = trans(c);
73     all = b + ' ' + a;
74     cout<<all<<endl;
75     kmp(all);
76     cout<<endl<<nex[len-1]<<endl; 
77     puts(nex[len - 1] == -1 ? "YES" : "NO");
78  
79 }
80  
81 int main()
82 {
83     //freopen("i.txt", "r", stdin);
84     //freopen("o.txt", "w", stdout);
85  
86     input();
87     solve();
88  
89     //system("pause");
90     return 0;
91 }
View Code

 

posted @ 2018-10-19 20:59  牛奶加咖啡~  阅读(147)  评论(0编辑  收藏  举报