Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
Re:建立一个替换关系,一直替换即可In Reply To:建立一个替换关系,一直替换即可 Posted by:yygy at 2023-05-17 11:32:47 // MyFirstApp.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // #define _CRT_SECURE_NO_WARNINGS 1 #include <iostream> #include <vector> #include <math.h> #include <stdio.h> #include <map> #include <algorithm> using namespace std; typedef __int64 lld; const int MAXN = 512; //经度角a, 纬度角b double GeodesicDistance(double r, double a1, double b1, double a2, double b2) { return r * acos(cos(b1) * cos(b2) * cos(a1 - a2) + sin(b1) * sin(b2)); } struct Point { double x, y; Point operator -(const Point& other) const { Point result; result.x = x - other.x; result.y = y - other.y; return result; } Point operator +(const Point& other) const { Point result; result.x = x + other.x; result.y = y + other.y; return result; } Point operator *(double c) const { Point result = *this; result.x *= c; result.y *= c; return result; } }p[1024], q[1024]; static void Rotate90(Point& dir) { double x = -dir.y; double y = dir.x; dir.x = x; dir.y = y; } int DoubleCompare(double a, double b) { if (fabs(a - b) < 1e-6) { return 0; } return a < b ? -1 : 1; } std::vector<std::string> strs; std::map<std::string, int> ids; std::vector<std::vector<int> > replaces; char buff[4096]; bool GetWord(char* buff, int len, int& iter, std::string& word) { word.clear(); while (iter < len && !isalpha(buff[iter]) && buff[iter] != '_') { iter++; } if (iter >= len) { return false; } while (iter < len && (isalpha(buff[iter]) || buff[iter] == '_')) { word.push_back(buff[iter]); iter++; } return true; } int GetSoftId(const std::string& source) { const std::map<std::string, int>::iterator iter = ids.find(source); if (iter != ids.end()) { return iter->second; } //新建 ids[source] = strs.size(); strs.push_back(source); replaces.push_back(std::vector<int>()); return ids[source]; } void Split(char* buff) { int len = strlen(buff); int iter = 0; std::string source; GetWord(buff, len, iter, source); int sourceId = GetSoftId(source); std::string word; while (GetWord(buff, len, iter, word)) { int wid = GetSoftId(word); replaces[sourceId].push_back(wid); } } int arr[2][1000000]; int len[2]; void Replace(int& tag, int& currentLength) { int* input=&arr[tag][0]; int* result=&arr[tag^1][0]; len[tag^1]=0; for (int i = 0; i < len[tag]; i++) { if (input[i] < 0) { result[len[tag^1]]=input[i]; len[tag^1]++; continue; } const std::vector<int>& add = replaces[input[i]]; if (!add.empty()) { //result.insert(result.end(), add.begin(), add.end()); //memcpy(add.data(), result+len[tag^1], sizeof(int)*add.size()); for(size_t id=0;id<add.size();id++) { result[len[tag^1]]=add[i]; len[tag^1]++; } currentLength -= strs[input[i]].size(); for (int j = 0; j < (int)add.size(); j++) { currentLength += strs[add[j]].size(); } } else { result[len[tag^1]]=input[i]; len[tag^1]++; } } tag^=1; } int main() { int width, target, n; while (cin >> width >> target >> n) { cin.getline(buff, 4096); strs.clear(); ids.clear(); replaces.clear(); for (int i = 0; i < n; i++) { cin.getline(buff, 4096); Split(buff); } int tag=0; int* plan=&arr[tag][0]; len[tag]=0; int currentLength = 0; while (cin.getline(buff, 4096)) { int len1 = strlen(buff); if (len1 == 0)break; int iter = 0; std::string word; while (GetWord(buff, len1, iter, word)) { int id = GetSoftId(word); plan[len[tag]] = id; len[tag]++; currentLength += strs[id].size(); } //回车加个-1 plan[len[tag]]=-1; len[tag]++; } while (currentLength < target) { Replace(tag, currentLength); } int acc = 0; bool newline = true; plan=arr[tag]; for (int i = 0; i < len[tag]; i++) { if (plan[i] < 0) { if (newline) { continue; } else { puts(""); //puts("[new line]"); acc = 0; newline = true; continue; } } int cid = plan[i]; int space = 0; if (!newline) { space++; } if (acc + space + (int)strs[cid].size() > width) { puts(""); acc = 0; newline = true; } if (!newline) { putchar(' '); acc++; } newline = false; printf("%s", &strs[cid][0]); acc += strs[cid].size(); } //原来换行的要保持,等会儿加 } return 0; } /* 21 103 7 king hosts leader vessel windless bay of horns horns bulls spears spears war needles Sudden Fate catched death_of doomed to death Death It was the end Sudden death_of Fjolner in the house of Frodi Death of the king in the vessel Fate catched doomed to death Fjolner in the house of Frodi It was the end of the hosts leader in the windless bay of bulls spears */ Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator