Run Time: 0.000
Ranking (as of 2016-03-15): 5 out of 141
Language: C++11
/*
UVa 1215 - String Cutting
To build using Visual Studio 2012:
cl -EHsc -O2 UVa_1215_String_Cutting.cpp
*/
#include <algorithm>
#include <vector>
#include <iterator>
#include <cstdio>
#include <cstring>
using namespace std;
const int n_max = 10000, k_max = 1000, nr_letters = 'z' - 'a' + 1;
char s[n_max];
int cuts[k_max];
bool l_letters[nr_letters], h_letters[nr_letters];
int main()
{
int nr_sets;
scanf("%d", &nr_sets);
while (nr_sets--) {
int k;
scanf("%d", &k);
for (int i = 0; i < k; i++)
scanf("%d", &cuts[i]);
scanf("%s", s);
int length = 0;
for (char* p = s; *p; p++, length++)
*p -= 'a';
vector<int> positions;
positions.push_back(0);
positions.push_back(length);
int cost = 0;
for (int i = 0; i < k; i++) {
int m = cuts[i];
vector<int>::iterator pi = lower_bound(positions.begin(), positions.end(), m);
int l = *prev(pi), h = *pi;
memset(l_letters, 0, sizeof(l_letters));
for (int j = l; j < m; j++)
l_letters[s[j]] = true;
memset(h_letters, 0, sizeof(h_letters));
for (int j = m; j < h; j++)
h_letters[s[j]] = true;
for (int i = 0; i < nr_letters; i++)
if (l_letters[i] ^ h_letters[i])
cost++;
positions.insert(pi, m);
}
printf("%d\n", cost);
}
return 0;
}
No comments:
Post a Comment