1061. Dating (20)-PAT甲级真题 第三个点的注意

本文介绍了一种特殊的字符串匹配算法,该算法通过比较四组字符串的前两个字符和后两个字符来确定日期、小时和分钟。文章详细展示了如何通过字符和数字的组合来识别特定的模式,并提供了一个C++实现示例。

传送门
今日水题呜呜呜
这题注意读题和考虑边界条件, 边界条件非常严苛
第三个点,必须判断是在0-9 a-n直接同时cnt=1的条件, 不过这属于代码数写方式的特例, 不同代码可能不会遇到这样的, 其他的点的问题可以看别的博主, 我这里就不赘述了

#include<bits/stdc++.h>
#define FAST ios::sync_with_stdio(false),cin.tie(0), cout.tie(0)
#define debug(a) cout << #a << ":" << a <<endl
#define For(i,x,y) for(int i=(x); i<=(y); ++i)

const int MAX = 2e5+7;
using namespace std;
int n,m;
int arr[MAX];
string day[8] = {"MON","TUE","WED","THU","FRI","SAT","SUN"};
int main(void) {
    string str[4];
    for(int i=0; i<4; i++){
        cin >>str[i];
       // debug(str[i]);
    }
    int cnt=0;
    int len0 = str[0].length(),len1 = str[1].length(),len2 = str[2].length(),len3 = str[3].length();
    int firstTwo = len0 > len1 ? len1: len0;
    int lastTwo  = len2 > len3 ? len3: len2;
    int d,h,m=0;
    for(int i=0; i<firstTwo; i++){
            //debug(i);
        if(str[0][i]==str[1][i]) {
            if(cnt==0&&(str[0][i] >= 'A' && str[0][i]<='G')) {//abcdefg
                cnt++;
                d = str[0][i]-'A';
            } else if( cnt==1&&((str[0][i] >= 'A' && str[0][i]<='N')||(isdigit(str[0][i])))) { // 注意从这里开始,如果替换为文末的代码是不能过的
                if(str[0][i] >= 'A' && str[0][i]<='N') h = str[0][i]-'A'+10;
                else if(isdigit(str[0][i])) h = str[0][i]-'0';
                cnt++;
                break;
            }
            //debug(cnt);
        }

    }
    for(int i=0; i<lastTwo; i++){
            //debug(i);
        if(str[2][i]==str[3][i]&&isalpha(str[2][i])) {
            //debug(cnt);
            if(cnt==2) {
                m = i;
                break;
            }
        }

    }
    cout << day[d];
    printf(" %02d:%02d",h,m);
    return 0;
}
 } else if( cnt==1) {
                if(str[0][i] >= 'A' && str[0][i]<='N') h = str[0][i]-'A'+10;
                else if(isdigit(str[0][i])) h = str[0][i]-'0';
                break;
            }
            //debug(cnt);
        }

    }
    for(int i=0; i<lastTwo; i++){
            //debug(i);
        if(str[2][i]==str[3][i]&&isalpha(str[2][i])) {
            cnt++;
            //debug(cnt);
            if(cnt==2) {
                m = i;
                break;
            }
        }

    }
    cout << day[d];
    printf(" %02d:%02d",h,m);
    return 0;
}
<think>好的,用户遇到了一个构建错误,提示在AndroidManifest.xml的第46行,provider标签的authorities属性包含无效字符&#39;$&#39;。我需要仔细分析这个问题,并给出解决方案。 首先,用户提供的错误信息显示,aapt.exe在处理资源时发现authorities属性有非法字符&#39;$&#39;。根据Android的文档,authorities属性必须是一个有效的Content Provider标识符,通常由包名和字符串组成,不能包含特殊字符,比如&#39;$&#39;。 查看用户之前的对话历史,用户一直在调整AndroidManifest.xml以兼容旧版的build-tools 23.0.3和android-23。在最后一次回复中,我提供的兼容版本里,provider的authorities属性使用了"${applicationId}.fileProvider"。问题可能出在这里,因为在旧版本的构建工具中,可能不支持使用${applicationId}这样的变量,或者需要正确的转义。 接下来,我需要验证这个假设。在旧版的Android构建工具中,${applicationId}通常是在构建过程中由Gradle替换的变量。但如果用户直接使用aapt命令行工具进行构建,而没有正确替换这个变量,那么aapt会直接使用这个字符串,导致出现非法字符,因为实际生成APK时applicationId可能未被正确解析,导致authorities属性中包含未替换的&#39;$&#39;符号。 解决方案是将authorities属性的值替换为具体的包名,而不是使用${applicationId}变量。例如,如果应用的包名是com.dw.Dating.lua,那么应该将authorities设置为"com.dw.Dating.lua.fileProvider"。这样就能避免使用变量,确保构建工具正确识别。 另外,用户可能还在使用旧版的Support Library,需要确认FileProvider的类名是否正确。例如,旧版本的Support Library可能使用android.support.v4.content.FileProvider,而用户是否正确引用了该类。 同时,检查用户提供的AndroidManifest.xml中的provider标签是否正确闭合,是否有其他语法错误。例如,是否遗漏了引号或标签闭合符号。 此外,用户可能在res/xml/file_paths_fanwei.xml中配置了错误的路径,虽然这个问题可能不会导致当前的错误,但需要确认该文件是否存在以及内容是否正确。 总结问题,用户需要将authorities属性中的${applicationId}替换为实际的包名,确保没有特殊字符,从而解决非法字符错误。同时,检查其他可能的配置问题,如FileProvider的类名和路径配置。</think>以下是修复 **`authorities` 属性包含非法字符 &#39;$&#39;** 的解决方案: --- ### 🔧 **问题定位** 在 `AndroidManifest.xml` 中: ```xml <provider android:name="android.support.v4.content.FileProvider" android:authorities="${applicationId}.fileProvider" <!-- ❌ 包含非法字符 &#39;$&#39; --> android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths_fanwei" /> </provider> ``` **错误原因**: 旧版 `aapt` 工具(build-tools 23.0.3)**不支持 `${applicationId}` 变量插值**,直接将其视为非法字符 `$`。 --- ### ✅ **解决方案** #### 方法 1:手动指定固定包名(推荐) 将 `android:authorities` 的值替换为实际包名: ```xml <provider android:name="android.support.v4.content.FileProvider" android:authorities="com.dw.Dating.lua.fileProvider" <!-- ✅ 使用固定包名 --> android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths_fanwei" /> </provider> ``` #### 方法 2:升级构建工具(长期方案) 升级到新版 build-tools(如 28.0.3)和 Gradle: ```gradle android { buildToolsVersion "28.0.3" } ``` 新版工具链支持 `${applicationId}` 插值,但需要同步升级 `targetSdkVersion` 至 28+。 --- ### 📦 **配套修复** #### 1. **确认 `FileProvider` 类路径正确** 确保使用的是 **Support Library v4**: ```xml android:name="android.support.v4.content.FileProvider" ``` #### 2. **检查 `file_paths_fanwei.xml`** 确保文件存在且内容合法(res/xml/file_paths_fanwei.xml): ```xml <?xml version="1.0" encoding="utf-8"?> <paths> <external-path name="hotfix" path="." /> </paths> ``` #### 3. **清理冗余配置** 移除不兼容的 `maxSdkVersion`(旧版工具可能无法识别): ```xml <!-- 删除以下属性 --> android:maxSdkVersion="28" ``` --- ### 🧪 **最终验证步骤** 1. **清理项目缓存** 删除 `Temp/` 和 `Library/` 目录后重新导入资源。 2. **强制重新生成 Manifest** 在 Unity 中导出 Android 项目时,确保勾选 "Write Permission" 和 "Write Owner Project"。 3. **使用 aapt 验证 Manifest** 在命令行运行: ```bash aapt dump badging AndroidManifest.xml ``` 确认无语法错误。 --- ### 📌 **注意事项** - **包名一致性**:确保 `package="com.dw.Dating.lua"` 与 `authorities="com.dw.Dating.lua.fileProvider"` 的包名完全一致。 - **Unity 版本兼容性**:Unity 2019 LTS 及以下版本需手动维护 AndroidManifest.xml,建议升级到 Unity 2020.3 LTS 或更高版本。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值