2 条题解

  • 3
    @ 2022-8-12 13:49:44

    好久都没发题解了


    爆搜,要注意很多点:

    1. 如果每次搜都搜26种,26^10如果不T的话你可以把我打扁咬打火机,所以把26个字母简化成3类(L,元音,辅音),如果这次3^10T了你可以抢走我的老冰棍咬打火机。
    2. 搜前预处理,要右移两位,不要奇奇怪怪RE了来tc我的题解咬打火机。
    3. 注意原来有没有L,很关键因为有些时候要填元音但没有L就只能咬打火机返回0。
    4. 没啥大点了注意细节
    5. 最后一点是我懒得写注释了

    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;
    }
    
    • -1
      @ 2023-3-29 23:08:08

      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
      上传者