class Solution {
public:
int findLucky(vector<int>& arr) {
int len = arr.size();
map<int, int> cnt;
for (auto v : arr) {
cnt[v]++;
}
int ans = -1;
for (auto it = cnt.begin() ; it != cnt.end() ; it++) {
if (it->first == it->second) {
ans = it->first;
}
}
return ans;
}
};
class Solution {
public:
int numTeams(vector<int>& rating) {
int n = rating.size();
int ans = 0;
if (n < 3) return 0;
for (int i = 1 ; i < n-1 ; i++) {
int ll = 0, ls = 0, rl = 0, rs = 0;
for (int j = 0 ; j < i ; j++) {
if (rating[j] < rating[i]) {
ls++;
} else if (rating[j] > rating[i]) {
ll++;
}
}
for (int j = i+1 ; j < n ; j++) {
if (rating[j] < rating[i]) {
rs++;
} else if (rating[j] > rating[i]) {
rl++;
}
}
ans += ls * rl + ll * rs;
}
return ans;
}
};
class UndergroundSystem {
public:
unordered_map<int, pair<string, int>> passenger;
unordered_map<string, unordered_map<string, pair<int, int>>> startEnd;
UndergroundSystem() {
}
void checkIn(int id, string stationName, int t) {
passenger[id] = make_pair(stationName, t);
}
void checkOut(int id, string stationName, int t) {
string start = passenger[id].first;
if (startEnd[start].find(stationName) == startEnd[start].end()) {
startEnd[start][stationName] = make_pair(t-passenger[id].second, 1);
} else {
startEnd[start][stationName].first += t-passenger[id].second;
startEnd[start][stationName].second += 1;
}
}
double getAverageTime(string startStation, string endStation) {
return (double)startEnd[startStation][endStation].first / (double)startEnd[startStation][endStation].second;
}
};
/**
* Your UndergroundSystem object will be instantiated and called as such:
* UndergroundSystem* obj = new UndergroundSystem();
* obj->checkIn(id,stationName,t);
* obj->checkOut(id,stationName,t);
* double param_3 = obj->getAverageTime(startStation,endStation);
*/
class Solution {
public:
vector<int> getNextArray(string pattern) {
int len = pattern.length();
vector<int> res(len+1,0);
int j = 0;
for (int i = 1 ; i < len ; i++) {
while (j && pattern[i] != pattern[j]) j = res[j];
if (pattern[i] == pattern[j]) j++;
res[i+1] = j;
}
return res;
}
int getNextState(int state, vector<int>& next, string pattern, char cur) {
int j = state;
while (j > 0 && pattern[j] != cur) j = next[j];
if (pattern[j] == cur) j++;
return j;
}
bool dec(int n, string& s) {
bool result = false;
for (int i = n-1 ; i >= 0 ; i--) {
if (s[i] > 'a') {
s[i]--;
result = true;
break;
} else {
s[i] = 'z';
}
}
return result;
}
long long dfs(int n, string s, vector<int>& next, string pattern) {
long long mod = (long long)1000000007;
int lp = pattern.length();
vector<vector<vector<long long>>> dp = vector<vector<vector<long long>>>(n+1, vector<vector<long long>>(lp+1, vector<long long>(2, 0)));
dp[0][0][1] = 1;
for (int i = 0 ; i < n ; i++) {
for (int j = 0 ; j < lp ; j++) {
int ns = getNextState(j, next, pattern, s[i]);
dp[i+1][ns][1] = (dp[i+1][ns][1] + dp[i][j][1]) % mod;
for (char k = 'a' ; k <= 'z' ; k++) {
ns = getNextState(j, next, pattern, k);
dp[i+1][ns][0] = (dp[i+1][ns][0] + dp[i][j][0]) % mod;
}
for (char k = 'a' ; k < s[i] ; k++) {
ns = getNextState(j, next, pattern, k);
dp[i+1][ns][0] = (dp[i+1][ns][0] + dp[i][j][1]) % mod;
}
}
}
long long result = (long long)0;
for (int i = 0 ; i < lp ; i++) {
result = (result + dp[n][i][0]) % mod;
result = (result + dp[n][i][1]) % mod;
}
return result;
}
int findGoodStrings(int n, string s1, string s2, string evil) {
vector<int> next = getNextArray(evil);
bool flag = dec(n, s1);
long long ans = (long long)0;
if (flag) {
ans = dfs(n, s2, next, evil) - dfs(n, s1, next, evil);
} else {
ans = dfs(n, s2, next, evil);
}
if (ans < 0) {
ans += (long long)1000000007;
}
return (int)ans;
}
};