仅仅调换定义字符串的顺序之后代码读入就出问题?
  • 板块学术版
  • 楼主HaloisAWA
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/11/20 13:33
  • 上次更新2024/11/20 16:11:13
查看原帖
仅仅调换定义字符串的顺序之后代码读入就出问题?
1420058
HaloisAWA楼主2024/11/20 13:33

出了奇奇怪怪问题的代码:

#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
string s,ttt;////////////////////////////////////////////////
vector<string> p;
ull dp[200010],maxn;
bool flag[200010];
int main() {
	cin.tie(0);
	ios::sync_with_stdio(false);
	while (cin >> ttt) {
		if (ttt == ".") break;
		p.push_back(ttt);
	}
	while (cin >> ttt)
		s += ttt;
	for (int i = 0;i < s.size();i ++) {
		for (int j = 0;j < p.size();j ++) {
			int pos = i - p[j].size() + 1;
			if (pos < 0) continue;
			//cout << "i=" << i << " s.substr(" << pos << "," << p[j].size() << ")=" << s.substr(pos,p[j].size()) << " p[" << j << "]=" << p[j] << "\n";
			//cout << "\tdp[" << i << "]=" << dp[i] << " dp[" << pos - 1 << "]+" << p[j].size() << "=" << dp[pos - 1] + p[j].size() << "\n";
			if (s.substr(pos,p[j].size()) == p[j] && (flag[pos - 1] || (!pos))) {
				dp[i] = max(dp[i],dp[pos - 1] + p[j].size());
				flag[i] = true;
			}
			//cout << "\tdp[" << i << "]=" << dp[i] << " dp[" << pos - 1 << "]+" << p[j].size() << "=" << dp[pos - 1] + p[j].size() << "\n";
		}
	}
	maxn = 0;
	for (int i = 0;i < s.size();i ++)
		maxn = max(maxn,dp[i]);
	cout << maxn << "\n";
	return 0;
}

正常能AC的代码:

#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
string s;////////////////////////////////////////
vector<string> p;
string ttt;///////////////////////////////////////
ull dp[200010],maxn;
bool flag[200010];
int main() {
	cin.tie(0);
	ios::sync_with_stdio(false);
	while (cin >> ttt) {
		if (ttt == ".") break;
		p.push_back(ttt);
	}
	while (cin >> ttt)
		s += ttt;
	for (int i = 0;i < s.size();i ++) {
		for (int j = 0;j < p.size();j ++) {
			int pos = i - p[j].size() + 1;
			if (pos < 0) continue;
			//cout << "i=" << i << " s.substr(" << pos << "," << p[j].size() << ")=" << s.substr(pos,p[j].size()) << " p[" << j << "]=" << p[j] << "\n";
			//cout << "\tdp[" << i << "]=" << dp[i] << " dp[" << pos - 1 << "]+" << p[j].size() << "=" << dp[pos - 1] + p[j].size() << "\n";
			if (s.substr(pos,p[j].size()) == p[j] && (flag[pos - 1] || (!pos))) {
				dp[i] = max(dp[i],dp[pos - 1] + p[j].size());
				flag[i] = true;
			}
			//cout << "\tdp[" << i << "]=" << dp[i] << " dp[" << pos - 1 << "]+" << p[j].size() << "=" << dp[pos - 1] + p[j].size() << "\n";
		}
	}
	maxn = 0;
	for (int i = 0;i < s.size();i ++)
		maxn = max(maxn,dp[i]);
	cout << maxn << "\n";
	return 0;
}

就这两个地方不一样,摸不着头脑QAQ 附上题目:P1470 [USACO2.3] 最长前缀 Longest Prefix

2024/11/20 13:33
加载中...