一:题目
二:思路
思路:
1.记得看书;不要一上来就莽;不然莽不过去的
2.这里我从书中了解到 f(0,b) = 0; f(0,a) = 1;f(1,c)=1;f(1,b)=3…
那么的话我们只要最终推导出f(1,b)=3;那么的话就是一个满足要求的字符串;
注意我们入口部分一定是从 0 开始;
3.接下来就是要判断一些细枝末节
字符是否合法;
字符是否够数;
error不满足自动机的规则 eg:abaaba 那么连续两个a的话就是不合法的
4.那么关于f(0,b) = 0;改用什么数据结构进行存储呢?
map<int,map<char,int>>m; //这个表示是一个二维映射即 我们两个key才可以确定一个value
三:上码
/**思路:1.记得看书;不要一上来就莽;不然是莽不过去的2.这里我从书中了解到 f(0,b) = 0; f(0,a) = 1;f(1,c)=1;f(1,b)=3....那么的话我们只要最终推导出f(1,b)=3;那么的话就是一个满足要求的字符串;注意我们入口部分一定是从 0 开始; 3.接下来就是要判断一些细枝末节字符是否合法;字符是否够数;error不满足自动机的规则 eg:abaaba 那么连续两个a的话就是不合法的 4.那么关于f(0,b) = 0;改用什么数据结构进行存储呢?map<int,map<char,int>>m; //这个表示是一个二维映射即 我们两个key才可以确定一个value
*/
#include<bits/stdc++.h>
using namespace std; bool judge(char ch) {if (ch == 'a' || ch == 'b' || ch == 'c' || ch == 'd') return false;else return true;}int main() {string str;string s;string strs;int state = 1;int cnt = 0;map<int,map<char,int> > m;//将自动机中的符号装进容器 这里是将从0开始的加了个1 主要就是处理不存在key值时候 m[][] = 0的问题 m[1]['b'] = 1;m[1]['a'] = 2;m[2]['c'] = 2;m[2]['b'] = 4;m[2]['d'] = 3;m[3]['a'] = 2; // if (m.find(m[1]['f']) != m.end()) cout << m[1]['a']; cin >> s;for (int i = 0; i < s.size(); i++) {str += s[i];int flag = 0;if (judge(s[i])) {int j = i+1;str = str.substr(0,str.size()-1);cout << str << endl; cout << "字符串中第" << j << "个字符"<< s[i] <<"是一个非法字符" << endl;return 0;}if (m[state][s[i]] == 0) {//我们要在下方计算出state之前完成判断,否则同一个 int j = i+1; //s[i]但是却有两个不同的state str = str.substr(0,str.size()-1);cout << str << endl; cout << "字符串中第" << j << "个字符"<< s[i] <<"发生了错误" << endl;return 0;} state = m[state][s[i]];//我们主要就是看这个状态是不是3是的话,那就是一个合法的字符串 //这个state我们是需要循环求出 state; if (state == 4) {cout << str << endl;cnt++;strs += str;str = "";//重新计算下一个单词 state = 1;//这个也是从头开始 flag = 1;}if (flag == 0 && i == s.size() - 1) {//flag = 0表示其不满足一个完整字符串的要求 cout << str << endl;cout << "最后一个词不完整" << endl; return 0; }}cout << "字符串共被划分为"<< cnt <<"个词";}