Submission #6604

#TimeUsernameProblemLanguageResultExecution timeMemory
6604Qwaz돌 옮기기 (GA7_stone)C++98
0 / 100
0 ms3432 KiB
#include <cstdio>
#include <algorithm>

using namespace std;
const int MAX = 400020;

int circle, n;
bool data[MAX<<1];

void input(){
	scanf("%d%d", &circle, &n);
	n <<= 1;

	int i;
	for(i = 0; i<n; i++){
		char t[2];
		scanf("%*d%s", t);
		data[i+n] = data[i] = t[0] == 'W';
	}
}

int fail[MAX];

void calcFail(){
	fail[0] = -1;

	int i;
	for(i = 1; i<n; i++){
		int last = i-1;

		fail[i] = -1;
		while(last >= 0){
			if(data[i] == data[fail[last]+1]) {
				fail[i] = fail[last]+1;
				break;
			} else last = fail[last];
		}
	}
}

int res = 0;

void check(int pos){
	int t = min(pos, n-pos);
	if(res == 0 || res > t) res = t;
}

void match(){
	int f = 0, s;
	for(s = 0; s<2*n; s++){
		while(f > 0 && data[f] == data[s])
			f = fail[f-1]+1;
		if(data[f] != data[s]) f++;
		if(f == n){
			check(s-(n-1));
			f = fail[n-1]+1;
		}
	}
}

int main(){
	input();

	calcFail();
	match();

	printf("%lld\n", res == 0 ? -1 : (long long)res * n);
	
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...