Cow Patterns
Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 4149 | Accepted: 1484 |
Description
FJ distinguishes his cows by the number of spots 1..S on each cow's coat (1 <= S <= 25). While not a perfect method, it serves his purposes. FJ does not remember the exact number of spots on each cow in the subgroup of troublemakers. He can, however, remember which cows in the group have the same number of spots, and which of any pair of cows has more spots (if the spot counts differ). He describes such a pattern with a sequence of K ranks in the range 1..S. For example, consider this sequence:
1 4 4 3 2 1
In this example, FJ is seeking a consecutive sequence of 6 cows from among his N cows in a line. Cows #1 and #6 in this sequence have the same number of spots (although this number is not necessarily 1) and they have the smallest number of spots of cows #1..#6 (since they are labeled as '1'). Cow #5 has the second-smallest number of spots, different from all the other cows #1..#6. Cows #2 and #3 have the same number of spots, and this number is the largest of all cows #1..#6.
If the true count of spots for some sequence of cows is:
5 6 2 10 10 7 3 2 9
then only the subsequence 2 10 10 7 3 2 matches FJ's pattern above.
Please help FJ locate all the length-K subsequences in his line of cows that match his specified pattern.
Input
Lines 2..N+1: Line i+1 describes the number of spots on cow i.
Lines N+2..N+K+1: Line i+N+1 describes pattern-rank slot i.
Output
Lines 2..B+1: An index (in the range 1..N) of the starting location where the pattern matches.
Sample Input
9 6 10 5 6 2 10 10 7 3 2 9 1 4 4 3 2 1
Sample Output
1 3
Hint
The sample input corresponds to the example given in the problem statement.
There is only one match, at position 3 within FJ's sequence of N cows.
/************************************************************************* > File Name: Cow_Patterns.cpp > Author: Zhanghaoran > Mail: chilumanxi@xiyoulinux.org > Created Time: 2016年01月20日 星期三 17时49分13秒 ************************************************************************/ #include <iostream> #include <algorithm> #include <cstring> #include <cstdio> #include <cstdlib> #include <vector> using namespace std; int N, K, S; int sp[100010]; int pa[25010]; int as[100010][32]; int bs[25010][32]; vector<int>ans; int next[25010]; void kmp_pre(){ int i = 0; int j = next[0] = -1; int t11, t12, t21, t22; while(i < K){ t11 = t12 = t21 = t22 = 0; for(int k = 1; k < pa[i]; k ++){ if(i > j) t11 += bs[i][k] - bs[i - j - 1][k]; else t11 += bs[i][k]; } t12 = bs[i][pa[i]] - bs[i - j - 1][pa[i]]; for(int k = 1; k < pa[j]; k ++){ t21 += bs[j][k]; } t22 = bs[j][pa[j]]; if(j == -1 || (t11 == t21 && t12 == t22)){ next[++ i] = ++ j; } else j = next[j]; } } void kmp(){ kmp_pre(); int i= 0, j = 0; int t11, t12 , t21, t22; while(i < N){ t11 = t12 = t21 = t22 = 0; for(int k = 1; k < sp[i]; k ++){ if(i > j) t11 += as[i][k] - as[i - j - 1][k]; else t11 += as[i][k]; } if(i > j) t12 = as[i][sp[i]] - as[i - j - 1][sp[i]]; else t12 = as[i][sp[i]]; for(int k = 1; k < pa[j]; k ++){ t21 += bs[j][k]; } t22 = bs[j][pa[j]]; if(j == -1 || (t11 == t21 && t12 == t22)){ i ++; j ++; if(j >= K){ ans.push_back(i - K + 1); j = next[j]; } } else j = next[j]; } } int main(void){ cin >> N >> K >> S; for(int i = 0 ;i < N; i ++){ scanf("%d", &sp[i]); if(i == 0){ for(int j = 0; j < 30; j ++){ as[i][j] = 0; } } else{ for(int j = 0; j < 30; j ++) as[i][j] = as[i - 1][j]; } as[i][sp[i]] ++; } for(int i = 0; i < K; i ++){ scanf("%d", &pa[i]); if(i == 0){ for(int j = 0; j < 30; j ++){ bs[i][j] = 0; } } else{ for(int j = 0; j < 30; j ++) bs[i][j] = bs[i - 1][j]; } bs[i][pa[i]] ++; } ans.clear(); kmp(); cout << ans.size() << endl; for(int i = 0; i < ans.size(); i ++) printf("%d\n", ans[i]); }
查看原文:http://chilumanxi.org/2016/02/17/poj-3167-cow-patterns/