2 条题解
-
3
好久都没发题解了
爆搜,要注意很多点:
- 如果每次搜都搜26种,26^10如果不T的话你可以
把我打扁咬打火机,所以把26个字母简化成3类(L,元音,辅音),如果这次3^10T了你可以抢走我的老冰棍咬打火机。 - 搜前预处理,要右移两位,不要奇奇怪怪RE了来
tc我的题解咬打火机。 - 注意原来有没有L,很关键因为有些时候要填元音但没有L就只能
咬打火机返回0。 - 没啥大点了注意细节
- 最后一点是我懒得写注释了
AC Code
#include <bits/stdc++.h> using namespace std; string s; int a[105], lens, l, x; long long dfs(int n) { if (n == lens + 2) return 1; if (a[n] == 1 || a[n] == 2) return dfs(n + 1); if ((a[n - 1] == 1 && a[n - 2] == 1 && a[n + 1] == 2 && a[n + 2] == 2) || (a[n - 1] == 2 && a[n - 2] == 2 && a[n + 1] == 1 && a[n + 2] == 1)) return 0; long long w = 0; if ((a[n - 1] == 1 && a[n - 2] == 1) || (a[n - 1] == 1 && a[n + 1] == 1) || (a[n + 1] == 1 && a[n + 2] == 1)) { a[n] = 2; if (n == x && l == 0) { l = 1; w += dfs(n + 1); l = 0; } else if (l == 0) { l = 1; w += dfs(n + 1); l = 0; w += dfs(n + 1) * 20; } else if (l == 1) { w += dfs(n + 1) * 21; } a[n] = 3; } else if ((a[n - 1] == 2 && a[n - 2] == 2) || (a[n - 1] == 2 && a[n + 1] == 2) || (a[n + 1] == 2 && a[n + 2] == 2)) { a[n] = 1; w += dfs(n + 1) * 5; a[n] = 3; if (n == x && l == 0) return 0; } else { a[n] = 2; if (n == x && l == 0) { l = 1; w += dfs(n + 1); l = 0; a[n] = 3; return w; } else if (l == 0) { l = 1; w += dfs(n + 1); l = 0; w += dfs(n + 1) * 20; } else { w += dfs(n + 1) * 21; } a[n] = 1; w += dfs(n + 1) * 5; a[n] = 3; } return w; } int main() { cin >> s; lens = s.length(); for (int i = 0; i < lens; i++) { if (s[i] == 'L') l = 1; if (s[i] == 'A' || s[i] == 'E' || s[i] == 'I' || s[i] == 'O' || s[i] == 'U') a[i + 2] = 1; else if (s[i] != '_') a[i + 2] = 2; else { a[i + 2] = 3; x = i + 2; } } printf("%lld\n", dfs(2)); return 0; }
- 如果每次搜都搜26种,26^10如果不T的话你可以
-
-1
dfs 预处理移动两格 #include<bits/stdc++.h> using namespace std; string s; int a[110],et; bool l=false; bool v(char a) { if(a=='A') return true; if(a=='E') return true; if(a=='I') return true; if(a=='O') return true; if(a=='U') return true; return false; } long long dfs(int n,bool l) { if(n!=2) if(a[n-3]==a[n-2]&&a[n-2]a[n-1]) return 0; if(ns.size()+2) return 1; if(a[n]1||a[n]2) return dfs(n+1,l); long long ans=0; if(net&&!l) { a[n]=2; ans+=dfs(n+1,1); a[n]=3; } else { if(l) { a[n]=1; ans+=5dfs(n+1,1); a[n]=2; ans+=21dfs(n+1,1); a[n]=3; } else { a[n]=1; ans+=5dfs(n+1,0); a[n]=2; ans+=20dfs(n+1,0); ans+=dfs(n+1,1); a[n]=3; } } return ans; } int main() { cin>>s; for(int i=0;i<s.size();i++) { if(s[i]'L') l=true;; if(v(s[i])) a[i+2]=1; else if(s[i]!='_') a[i+2]=2; else { a[i+2]=3; et=i+2; } } cout<<dfs(2,l); return 0; }
- 1
信息
- ID
- 2007
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 3
- 标签
- (无)
- 递交数
- 41
- 已通过
- 25
- 上传者